UVALive 7079 - How Many Maos Does the Guanxi Worth(最短路Floyd)
题目大意:n个人编号从1到n,m条关系,a找b帮忙或b找a帮忙需要花费c元,当然a可以通过d找b帮忙(即a找d帮忙,d再找b帮忙)
现在1号要找n号帮忙,你需要去找1号和n号之外的人,让他不帮忙,即破坏这条关系链,如果1号最终能找n号b帮忙则输出过程中所
用的最大花费,否则输出Inf
分析:
转化为最短路问题:a到b的花费当做a点到b点的距离
破坏关系链只需在2—n-1号这n-3点中依次找每一个点,将该点到其他点和其他点到该点的距离令为INF,然后找一个1到n的最小距离,
得到n-3个距离,输出这n-3个距离中最大的距离
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; const int N = 40; const int INF = 0x3f3f3f3f; int G[N][N], maps[N][N]; int n; void Init() { int i, j; for(i = 1 ; i <= n ; i++) { for(j = 1 ; j <= n ; j++) { if(i == j) G[i][j] = 0; else G[i][j] = G[j][i] = INF; } } } int Floyd(int m) { int i, j, k; for(i = 1 ; i <= n ; i++) { for(j = 1 ; j <= n; j++) { if(i == m || j == m) maps[i][j] = maps[j][i] = INF;//让编号为m的人不帮,来破坏该条关系链 else maps[i][j] = maps[j][i] = G[i][j]; } } for(k = 1 ; k <= n ; k++) { for(i = 1 ; i <= n ; i++) { for(j = 1 ; j <= n ; j++) { if(maps[i][j] > maps[i][k] + maps[k][j]) maps[i][j] = maps[i][k] + maps[k][j]; } } } return maps[1][n]; } int main() { int m, i, a, b, c; while(scanf("%d%d", &n, &m), m + n) { Init(); while(m--) { scanf("%d%d%d", &a, &b, &c); G[b][a] = G[a][b] = c; } int ans = 0; for(i = 2 ; i <= n - 1 ; i++) ans = max(ans, Floyd(i)); if(ans == INF) printf("Inf\n"); else printf("%d\n", ans); } return 0; }