题目大意:
给你以T, 代表T组测试数据,一个n代表有n个点, 一个m代表有m条边, 每条边有三个参数,a,b,c表示从a到b的这条路上最大的承受重量是c,
让你找出一条线路,要求出在这条线路上的最小承重, 在所有其他线路最大。
题目分析:
这里只要将spfa进行一下变形就可以解决这问题了。
首先 我们的dist数组,起点位置要初始化为 INF, 其他位置初始化为 0
然后我们更新 dist 数组, 结果输出 dist[n]就行了
为什么这样写: 因为我们每次要找 所有路径中的最大边的最小一个, 说的可能有写绕口
递推式是: dist[e] = max(dist[e], min(dist[s], G[s][i]) );
下面是代码:
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 using namespace std; 8 #define INF 0xfffffff 9 #define maxn 1050 10 11 struct Edge 12 { 13 int e; 14 long long w; 15 }; 16 vector<Edge> G[maxn]; 17 long long dist[maxn]; 18 bool vis[maxn]; 19 int m, n; 20 long long Spfa() 21 { 22 Edge P, Pn; 23 P.e = 1, P.w = 0; 24 queue <Edge> Q; 25 Q.push(P); 26 27 while( !Q.empty() ) 28 { 29 P = Q.front(); 30 Q.pop(); 31 vis[P.e] = false; 32 int len = G[P.e].size(); 33 34 for(int i=0; i<len; i++) 35 { 36 Pn = G[P.e][i]; 37 38 if(dist[Pn.e] < min(dist[P.e],Pn.w) ) 39 { 40 dist[Pn.e] = min(dist[P.e],Pn.w); 41 42 if(!vis[Pn.e]) 43 { 44 vis[Pn.e] = true; 45 Q.push(Pn); 46 } 47 } 48 } 49 } 50 return dist[n]; 51 } 52 void Init() 53 { 54 for(int i=1; i<=n ;i++) 55 { 56 G[i].clear(); 57 vis[i] = false; 58 dist[i] = 0; 59 } 60 dist[1] = INF; 61 } 62 int main() 63 { 64 int T, cas = 1; 65 Edge P; 66 cin >> T; 67 68 while(T--) 69 { 70 scanf("%d%d",&n,&m); 71 72 Init(); 73 for(int i=0; i<m; i++) 74 { 75 int a, b, c; 76 scanf("%d%d%d",&a,&b,&c); 77 P.e = b, P.w = c; 78 79 G[a].push_back(P); 80 81 P.e = a; 82 83 G[b].push_back(P); 84 } 85 long long ans = Spfa(); 86 87 printf("Scenario #%d: %lld ",cas++,ans); 88 if(T) 89 printf(" "); 90 91 } 92 return 0; 93 }