POJ 1797 Heavy Transprotation ( 最短路变形 || 最小生成树 )
题意 : 找出 1 到 N 点的所有路径当中拥有最大承载量的一条路,输出这个最大承载量!而每一条路的最大承载量由拥有最大承载量的那一条边决定
分析 : 与 POJ 2253 相似且求的东西正好相反,属于求从一个指定起点到终点的所有路径当中拥有最大or最小的边是什么。只要改变一下 Dijkstra 中 DP 的意义 ==> Dis[i] 表示起点到 i 点的所有路径当中拥有最大or最小的边的权值。当然也可以使用最小生成树做法,但是这里的边应该是从大排到小,其他的都和 POJ 2253 一模一样了!
#include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 1010; bool vis[maxn]; int G[maxn][maxn],dis[maxn]; int n, m; int dijkstra(int v) { int i, j, u; for(i=1;i<=n;i++){ dis[i]=G[v][i]; vis[i]=false; } dis[v]=0; vis[v]=true; for(i=1;i<n;i++){ int MaxEdge = -INF; for(j=1;j<=n;j++){ if(!vis[j] && MaxEdge < dis[j]){ MaxEdge = dis[j]; u = j; } } if(MaxEdge == -INF) break; vis[u]=true; for(j=1;j<=n;j++){ if(!vis[j]){ dis[j] = max(dis[j], min(dis[u], G[u][j])); } } } return dis[n]; } int main() { int nCase; scanf("%d", &nCase); for(int t=1; t<=nCase; t++){ scanf("%d %d", &n, &m); for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) G[i][j] = 0; int a, b, c; for(int i=0; i<m; i++){ scanf("%d %d %d", &a, &b, &c); G[a][b] = G[b][a] = c; } printf("Scenario #%d:\n", t); printf("%d\n\n", dijkstra(1)); } return 0; }