POJ ACM 1125 Stockbroker Grapevine (最短路Floyd)

http://poj.org/problem?id=1125

题意:要求找到消息传递给所有人,先传递给谁最快并求出传递的时间.

赤裸裸的Floyd找任意一点到其他点的最短路径

输入:第一行输入一个数字n,表示有n个人. 若n==0表示测试结束.

  接下来输入n行数据,每一行开头输入一个m,表示接受这人消息的人的个数.

  然后输入m对数据,每对数据表示接收消息的人的号码和所需要时间.

输出:输出传递最快的人和传递时间,号码和时间中间有1个空格.

View Code
 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 }

 

posted @ 2012-08-31 20:28  zx雄  阅读(232)  评论(0编辑  收藏  举报