标签:
Description :
Input :
Output :
Sample Input :
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output :
Scenario #1: 4
题意:货物运行时两个地点可以有多条街道连接,每条街道对车辆的最大承载量是不同的,那么现在需要求出从地点1运送货物到地点n所能承载的最大货物量,假如中间有很多条街道相通,能承受的只能是最少的量,那么只需要求出这些最少的中间最大的那个就行了
#include<stdio.h> #define INF 0x3f3f3f3f #define N 1100 #define min(a, b) (a < b ? a : b) #define max(a, b) (a > b ? a : b) int G[N][N], dist[N], visit[N], n; //dist数组存放的是所有从1到i路径之间的每一小段的最小值的最大值 void Init() { int i, j; for (i = 0; i <= n; i++) { visit[i] = 0; dist[i] = -INF; for (j = 0; j <= n; j++) G[i][j] = -INF; } } void Dist() { int i, j, idex, Min; dist[1] = 0; for (i = 1; i <= n; i++) { Min = -INF; for (j = 1; j <= n; j++) { if (dist[j] > Min && !visit[j]) { Min = dist[j]; idex = j; } } visit[idex] = 1; for (j = 1; j <= n; j++) { if (idex == 1) { if (!visit[j] && dist[j] < max(dist[idex], G[idex][j])) dist[j] = max(dist[idex], G[idex][j]); } //如果idex是1时仍然用min,则dist数组中都是0,为了不影响结果要max,这样dist数组就不会全是0了 else { if (!visit[j] && dist[j] < min(dist[idex], G[idex][j])) dist[j] = min(dist[idex], G[idex][j]); } } } } int main () { int T, m, a, b, c, k = 0; scanf("%d", &T); while (T--) { Init(); k++; scanf("%d %d", &n, &m); while (m--) { scanf("%d %d %d", &a, &b, &c); G[a][b] = max(G[a][b], c); G[b][a] = G[a][b]; } Dist(); printf("Scenario #%d:\n", k); printf("%d\n", dist[n]); printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4678244.html