题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量
解题思路:其实这个求最大边可以近似于求最短路,只要修改下找最短路更新的条件就可以了
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn=1010; const int INF=0x3f3f3f3f; int lowc[maxn],cost[maxn][maxn]; bool vis[maxn]; int T; int n,m; void Dijkstra() { for(int i=2;i<=n;i++) { lowc[i]=cost[1][i]; } lowc[1]=0; vis[1]=1; for(int i=1;i<=n;i++) { int k=-1; for(int j=1;j<=n;j++) { if(!vis[j]&&(k==-1||lowc[j]>lowc[k]))//此处是找出最大的值,因为这里wa了好几发 { k=j; } } if(k==-1) break; vis[k]=1; for(int j=1;j<=n;j++) { if(!vis[j]&&lowc[j]<min(lowc[k],cost[j][k])) //lowc[j]=max(lowc[j],max(lowc[k],cost[k][j])); { lowc[j]=min(lowc[k],cost[j][k]); } } } } void init() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) cost[i][j]=0; else cost[i][j]=0; } } } int main() { ios::sync_with_stdio(false);cin.tie(0); cin>>T; int kase=1; while(T--) { cin>>n>>m; memset(vis,0,sizeof(vis)); init(); for(int i=1;i<=m;i++) { int u,v,w; cin>>u>>v>>w; cost[u][v]=cost[v][u]=w; } Dijkstra(); printf("Scenario #%d:\n",kase++); printf("%d\n\n",lowc[n]); } return 0; }
原文地址:https://www.cnblogs.com/Fy1999/p/9463980.html
时间: 2024-10-29 01:13:03