http://poj.org/problem?id=1797
题意:现给出一些城市的街道,这些街道都从 1 - n 开始编号, 然后街道从 i - j 的负载量给你, 让你求 1 - n 最大的负载量。
例子:
1 从 1 - 2的负载量是3 从 2 - 3的负载量是5 综合考虑来说 1 - 3 的负载量为 3
3 3 但 例子中还有1 - 3 为4, 所以 1-3 的负载量 = max(3, 4)
1 2 3 其实也就是最短路的模板, 把最短路的条件改一下就行了。
1 3 4
2 3 5
注意输出格式, 在每个例子后要有一个空格。
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; typedef long long LL; #define oo 0x3f3f3f3f #define maxn 1100 int maps[maxn][maxn], dist[maxn], v[maxn]; int n; void Init() { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) maps[i][j]=maps[j][i] = 0; } int Dij() { memset(v, 0, sizeof(v)); for(int i=1; i<=n; i++) dist[i] = maps[1][i]; v[1] = 1; for(int i=1; i<n; i++) { int index, maxs = -1; for(int j=1; j<=n; j++) { if(maxs < dist[j] && !v[j]) { maxs = dist[j]; index = j; } } v[index] = 1; for(int j=1; j<=n; j++) { if(!v[j] && dist[j] <min(maps[index][j], maxs)) dist[j] = min(maps[index][j], maxs); } } return dist[n]; } int main() { int T, m, a, b, c, cnt=1; scanf("%d", &T); while(T --) { scanf("%d %d", &n, &m); Init(); while(m --) { scanf("%d %d %d", &a, &b, &c); maps[a][b] = maps[b][a] = c; } int ans = Dij(); printf("Scenario #%d: ", cnt++); printf("%d ", ans); } return 0; }