poj 1125 (floyd)

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

题意:在经纪人的圈子里,他们各自都有自己的消息来源,并且也只相信自己的消息来源,他们之间的信息传输也需要一定的时间。现在有一个消息需要传播,求从哪个经纪人开始传播所需的时间是最短的,所有经纪人都要收到信息,输出时间和那个经纪人的编号。

思路:用floyd算出两个点之间的短的传播时间。当这个点传播到某个点的时间最大时,要么是传播不到,要么这个点就是最后一个经纪人所需要接受到信息的最短时间

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define inf 999999
 4 
 5 int graph[ 105 ][ 105 ],n;
 6 
 7 
 8 void floyd()
 9 {
10     int k,i,j,Min,loc,Minroad;
11     for( k = 1 ; k <= n ; k++ )        //这五行代码就是floyd的思想,从某个点到某个点的最短路径有可能是他们直接相连的,也有可能是通过其他的点相连接的。
12         for( i = 1 ; i <= n ; i++ )
13             for( j = 1 ; j <= n ; j++ )
14                 if( i != j && graph[ i ][ j ] > graph[ i ][ k ] + graph[ k ][ j ] )    
15                     graph[ i ][ j ] = graph[ i ][ k ] + graph[ k ][ j ];
16         Min = inf;
17     for( i = 1 ; i <= n ; i++ )         //枚举每个经纪人。
18     {
19         Minroad = 0;
20         for( j = 1 ; j <= n ; j++)
21             if( i != j && Minroad < graph[ i ][ j ] )    //求出他们的所需的最长时间
22                 Minroad = graph[ i ][ j ];
23         if( Min > Minroad )
24         {
25             Min = Minroad;
26             loc = i;
27         }
28     }
29     printf("%d %d
",loc,Min);
30 }
31 
32 
33 int main()
34 {
35  //   freopen("in.txt","r",stdin);
36     int x,a,b;
37     while(scanf("%d",&n),n)
38     {
39         for(int i = 0 ; i <= n ; i++)
40             for(int j = 0 ; j <= n ; j++)
41             {
42                  graph[ i ][ j ] = inf;
43             }
44         for(int i = 1 ; i <= n ; i++)
45         {
46             scanf("%d",&x);
47             for(int j =0  ; j < x ; j++)
48             {
49                 scanf("%d%d",&a,&b);
50                 graph[ i ][ a ] = b;
51             }
52         }
53         floyd();
54     }
55     return 0;
56 }
原文地址:https://www.cnblogs.com/Tree-dream/p/5731802.html