POJ 1125 Stockbroker Grapevine
题目大意是找出一个人作为源点,使得从这个人开始散播信息到全部人都得到信息所用时间最少,输出这个人的号码跟最少时间。算是一道典型的最短路的题目,用floyd算法即可解决。
AC code:
1 #include <iostream>
2 #define MAX 101
3 #define INF 1000000
4 using namespace std;
5 int dist[MAX][MAX];
6 int map[MAX][MAX];
7 int n;
8 int contact;
9 void input()
10 {
11 int i, j;
12 int id, time;
13 for(i = 1; i <= n; i++)
14 for(j = 1; j <= n; j++)
15 if(i == j) map[i][j] = 0;
16 else map[i][j] = INF;
17 for( i = 1; i <=n; i ++)
18 {
19 scanf("%d", &contact);
20 for( j = 1; j <=contact; j++)
21 {
22 scanf("%d%d", &id, &time);
23 map[i][id] = time;
24 }
25 }
26 }
27 void floyd()//用floyd算法找出任意两点的最短路
28 {
29 int k, i ,j;
30 for(k = 1; k <= n; k++)
31 for(i = 1; i <= n; i++)
32 for(j = 1; j <= n; j++)
33 if(map[i][j] > map[i][k] + map[k][j])
34 map[i][j] = map[i][k] + map[k][j];
35 }
36 int main()
37 {
38 while(scanf("%d", &n) != EOF && n != 0)
39 {
40 input();
41 floyd();
42 int min_time = INF, max, person_id;
43 for(int i = 1; i <= n; i++)
44 {
45 max = 0;
46 for(int j = 1; j <= n; j++)
47 if(map[i][j] >max )
48 max = map[i][j];//找出从第i个人开始传播到传播完所用的时间
49 if(max < min_time)//找出时间最少的那个人
50 {
51 min_time = max;
52 person_id = i;
53 }
54 }
55 if(min_time != INF)
56 printf("%d %d\n", person_id, min_time);
57 else
58 printf("disjoint\n");
59 }
60 return 0;
61 }