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 }

 

你可能感兴趣的:(broker)