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 }

 

posted @ 2014-12-05 10:00  向前走丶不回首  阅读(175)  评论(0编辑  收藏  举报