题意:
从某个股票经纪人开始传播虚假信息,所有人接收到信息所需的最短时间,并且找出从谁开始的。输出这个人的编号和所需时间。
分析:
求出每两个人之间所需的最短时间,Floyd。然后求出每个人要把信息传播到所有人所需的时间。这些时间的最小值即为所求。每个人要把信息传播到所有人所需时间怎么求?就是每个人传播信息到其他人所需时间的最大值,因为在这个时间范围内,其他人都能收到信息。
代码:
1 #include<stdio.h>
2 #define N 101
3 const int MAX = 0x7fffffff;
4 int cont[N][N];
5 void Floyd(int n);
6
7 int main()
8 {
9 int stock,con,to,tim,i,j;
10
11 while(scanf("%d",&stock) && stock)
12 {
13 for( i = 1 ; i <= stock ; ++i)
14 {
15 cont[i][i] = 0;
16 for( j = 1 ; j < i ; ++j)
17 cont[i][j] = cont[j][i] = MAX;
18 }
19 for(i = 1 ; i <= stock ; ++i)
20 {
21 scanf("%d",&con);
22 while(con--)
23 {
24 scanf("%d%d",&to,&tim);
25 cont[i][to] = tim;
26 }//while(con--)
27
28 }//for(i)
29
30 Floyd(stock);
31 }
32 //system("pause");
33 return 0;
34 }
35
36 void Floyd(int n)
37 {
38 int start,i,j,k,res,min,temp;
39 res = MAX;
40
41 for(k = 1 ; k <= n ; ++k)
42 for(i = 1 ; i <= n ; ++i)
43 for(j = 1 ; j <= n ; ++j)
44 if(cont[i][k] != MAX && cont[k][j] != MAX)
45 {
46 temp = cont[i][k] + cont[k][j];
47 if(temp < cont[i][j] )
48 cont[i][j] =temp;
49 }
50
51 for(i = 1; i <= n ; ++i)
52 {
53 min = 0;
54 for(j = 1; j <= n ; ++j)
55 {
56 if(cont[i][j] > min)
57 min = cont[i][j];
58 }//for(j)
59 if(min < res)
60 {
61 res = min;
62 start = i ;
63 }
64 }
65 if(res != MAX)
66 printf("%d %d\n",start,res);
67 else
68 printf("disjoint\n");
69
70 }