POJ ACM 1125 Stockbroker Grapevine (最短路Floyd)
http://poj.org/problem?id=1125
题意:要求找到消息传递给所有人,先传递给谁最快并求出传递的时间.
赤裸裸的Floyd找任意一点到其他点的最短路径
输入:第一行输入一个数字n,表示有n个人. 若n==0表示测试结束.
接下来输入n行数据,每一行开头输入一个m,表示接受这人消息的人的个数.
然后输入m对数据,每对数据表示接收消息的人的号码和所需要时间.
输出:输出传递最快的人和传递时间,号码和时间中间有1个空格.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 using namespace std; 3 const int MAX = 100 + 10; 4 const int INF = 0x3fffffff; 5 int map[MAX][MAX]; 6 int num; 7 void floyd() 8 { 9 int i,j,k; 10 for(k=1;k<=num;k++) 11 { 12 for(i=1;i<=num;i++) 13 { 14 for(j=1;j<=num;j++) 15 { 16 if(map[i][k] + map[k][j] < map[i][j]) 17 { 18 map[i][j] = map[i][k] + map[k][j]; 19 } 20 } 21 } 22 } 23 } 24 int main() 25 { 26 while(cin>>num,num) 27 { 28 int i,j; 29 for(i=1;i<=num;i++) 30 { 31 for(j=1;j<=num;j++) 32 { 33 if(i == j) 34 { 35 map[i][j] = 0; 36 } 37 else 38 { 39 map[i][j] = INF; 40 } 41 42 } 43 } 44 for(i=1;i<=num;i++) 45 { 46 int x; 47 cin>>x; 48 for(j=1;j<=x;j++) 49 { 50 int a,b; 51 cin>>a>>b; 52 map[i][a]=b; 53 } 54 } 55 floyd(); 56 int mid; 57 int min = 0; 58 int sum = INF; 59 int mark; 60 for(i=1;i<=num;i++) 61 { 62 mark = 1; 63 for(j=1;j<=num;j++) 64 { 65 if(map[i][j] == INF) 66 { 67 mark = 0; 68 break; 69 } 70 } 71 if(mark) 72 { 73 mid = 0; 74 for(j=1;j<=num;j++) 75 { 76 if(mid < map[i][j]) 77 { 78 mid = map[i][j]; 79 } 80 } 81 if(sum > mid) 82 { 83 sum = mid; 84 min = i; 85 } 86 } 87 } 88 cout<<min<<' '<<sum<<endl; 89 } 90 return 0; 91 }