POJ Stockbroker Grapevine 1125 多源最短路(Floyd)
题目大意:
股票经纪人要散播股票的谣言,每个人都有人际关系,每个人只信任他相信的人传播的谣言, 其实也就是有向图。问 哪个人能最快的将谣言传播给所有人,并且求出传过去的最短时间。
题目分析:
我们用Floyd求出每个点的最短路,
然后搜索每个点,看和这个点所连接点的最长时间就是这个人散播最后谣言的时间
然后从所有的点中找出时间最长的点
1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cstdio> 6 #include <algorithm> 7 #include <vector> 8 #include <queue> 9 using namespace std; 10 #define INF 0xfffffff 11 #define maxn 150 12 13 int G[maxn][maxn]; 14 int n; 15 16 void Floyd() 17 { 18 for(int k=1; k<=n; k++) 19 { 20 for(int i=1; i<=n; i++) 21 { 22 for(int j=1; j<=n; j++) 23 { 24 G[i][j] = min(G[i][j],G[i][k] + G[k][j]); 25 } 26 } 27 } 28 int Min = INF, index = 1; 29 30 for(int i=1; i<=n; i++) 31 { 32 int Max = 0; 33 for(int j=1; j<=n; j++) 34 { 35 Max = max(Max,G[i][j]); 36 } 37 if(Max < Min) 38 { 39 Min = Max; 40 index = i; 41 } 42 } 43 44 if(Min == INF) 45 printf("disjoint\n"); 46 else 47 printf("%d %d\n",index,Min); 48 49 } 50 void Init() 51 { 52 for(int i=0; i<=n; i++) 53 { 54 G[i][i] = 0; 55 for(int j=0; j<i; j++) 56 G[i][j] = G[j][i] = INF; 57 } 58 } 59 60 int main() 61 { 62 while(cin >> n, n) 63 { 64 int t, e, w; 65 Init(); 66 for(int i=1; i<=n; i++) 67 { 68 cin >> t; 69 for(int j=0; j<t; j++) 70 { 71 cin >> e >> w; 72 G[i][e] = min(G[i][e],w); 73 } 74 } 75 76 Floyd(); 77 78 } 79 return 0; 80 }