好久没刷51nod了,又听说topcoder有很多好题。那么就来51nod上刷吧。(那个客户端搞得有点烦(看不懂))
当图不连通的时候,答案为无穷大。
当图连通时,两个点之间的最大差值就是最短路长度乘上 $d$,跑floyd再看最短路的最大值即可。
1 #include <bits/stdc++.h> 2 3 const int N = 55; 4 const int INF = 0x3f3f3f3f; 5 6 char s[N]; 7 int mp[N][N], fa[N], n; 8 9 int getfa(int x) { 10 return x == fa[x] ? x : fa[x] = getfa(fa[x]); 11 } 12 13 void unit(int x, int y) { 14 x = getfa(x), y = getfa(y); 15 fa[x] = y; 16 } 17 18 void floyd() { 19 for (int k = 1; k <= n; k++) 20 for (int i = 1; i <= n; i++) 21 for (int j = 1; j <= n; j++) 22 mp[i][j] = std::min(mp[i][j], mp[i][k] + mp[k][j]); 23 } 24 25 int main() { 26 int T; 27 scanf("%d", &T); 28 while (T--) { 29 int d; 30 scanf("%d%d", &n, &d); 31 for (int i = 1; i <= n; i++) fa[i] = i; 32 for (int i = 1; i <= n; i++) { 33 scanf("%s", s + 1); 34 for (int j = 1; j <= n; j++) { 35 if (s[j] == ‘Y‘ && i != j) 36 mp[i][j] = d, unit(i, j); 37 else if (i != j) 38 mp[i][j] = INF; 39 else 40 mp[i][j] = 0; 41 } 42 } 43 int cnt = 0; 44 for (int i = 1; i <= n; i++) 45 if (getfa(i) == i) cnt++; 46 if (cnt > 1) { 47 puts("-1"); 48 continue; 49 } 50 floyd(); 51 int ans = 0; 52 for (int i = 1; i <= n; i++) 53 for (int j = 1; j <= n; j++) 54 if (mp[i][j] < INF) 55 ans = std::max(ans, mp[i][j]); 56 printf("%d\n", ans); 57 } 58 return 0; 59 }
原文:https://www.cnblogs.com/Mrzdtz220/p/11711204.html