最短路 floyd poj1125 Stockbroker Grapevine

题目连接:http://poj.org/problem?id=1125

题目就是要求你算每个点在能够到达所有点的情况下求到达所有点的费时中最大的最小值及其起点,如果不能到达直接输出disjoint。

代码

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #define max 1000000
 4 using namespace std;
 5 int map[106][105];
 6 void init(int n)
 7 {
 8     int i,j;
 9     for(i = 1;i <= n;i++)
10     {
11         for(j = 1;j <= n;j++)
12         map[i][j] = max;
13         map[i][i] = 0;
14     }
15 }
16 void floyd(int n)
17 {
18     int k,i,j;
19 
20     for(k = 1;k <= n;k++)
21     {
22         for(i = 1;i <= n;i++)
23         {
24             for(j = 1;j <= n;j++)
25             {
26                 if(map[i][j] > map[i][k]+map[k][j])
27                 map[i][j] = map[i][k]+map[k][j];
28             }
29         }
30     }
31 }
32 
33 int main()
34 {
35     int n,m,v,t,ansi,i,j;
36     while(scanf("%d",&n)&&n)
37     {
38         init(n);
39         for(i = 1;i <= n;i++)
40         {
41             scanf("%d",&m);
42             while(m--)
43             {
44                 scanf("%d%d",&v,&t);
45                 map[i][v] = t;
46 
47             }
48 
49         }
50         floyd(n);
51         int leap = 1;
52         int ans,sub;
53         ans = max,sub = -1;
54         for(i = 1;i <= n;i++)
55         {
56             sub = -1;
57             for(j = 1;j <= n;j++)
58             {
59                 if(map[i][j] > max &&i != j)
60                 leap = 0;
61                 else if(map[i][j] > sub &&i != j)
62                 sub = map[i][j];
63             }
64 
65             if(sub < ans)
66             ans = sub,ansi = i;
67         }
68 
69        if(leap)
70         printf("%d %d\n",ansi,ans);
71         else
72        puts("disjoint");
73 
74 
75     }
76     return 0;
77 }
posted @ 2012-11-13 16:59  某某。  阅读(156)  评论(0编辑  收藏  举报