poj 1797 Heavy Transportation(Dijkstar变形)
http://poj.org/problem?id=1797
给定n个点,及m条边的最大负载,求顶点1到顶点n的最大载重量。
用Dijkstra算法解之,只是需要把“最短路”的定义稍微改变一下,
A到B的路长定义为路径上边权最小的那条边的长度,
而最短路其实是A到B所有路长的最大值。
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<algorithm> #define N 1010 #define INF 0x3f3f3f3f using namespace std; int G[N][N], dist[N]; bool vis[N]; int n; void Init() { int i; memset(vis, false, sizeof(vis)); for(i = 1 ; i <= n ; i++) dist[i] = G[1][i];//dist[i]表示从起点到i点的载重量 } int Dij(int Start, int End) { int Max, i, j, index; dist[Start] = 0; for(i = 1 ; i <= n ; i++) { Max = 0; for(j = 1 ; j <= n; j++) { if(!vis[j] && Max < dist[j]) { Max = dist[j]; index = j; } }//找最大载重量 vis[index] = true; for(j = 1 ; j <= n ; j++) { if(!vis[j] && dist[j] < min(dist[index], G[index][j])) dist[j] = min(dist[index], G[index][j]); } } return dist[End]; } int main() { int m, a, b, c, t, x = 0; scanf("%d", &t); while(t--) { x++; memset(G, 0, sizeof(G)); scanf("%d%d", &n, &m); while(m--) { scanf("%d%d%d", &a, &b, &c); G[a][b] = G[b][a] = c; } Init(); printf("Scenario #%d:\n%d\n\n", x, Dij(1, n)); } return 0; }