Shirlies
宁静专注认真的程序媛~

求最短路,Floyd算法,简单的应用

不过题目真的很晦涩。。。第一个数x表示与第i个数(通俗一点,第i行,其实也是标号为i的点)相邻的点的个数,然后后面有x个值。

代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 int g[22][22];
 6 int n;
 7 
 8 bool init()
 9 {
10     int num;
11     for(int i = 1;i <= 20;i ++)
12     {
13         for(int j = 1;j <= 20;j ++)
14         {
15             if(i == j)
16                 g[i][j] = 0;
17             else 
18                 g[i][j] = 1000000;
19         }
20     }
21     for(int i = 1 ;i <= 19;i ++)
22     {
23         if(scanf("%d",&num) != 1)
24             return false;
25         for(int j = 0;j < num;j ++)
26         {
27             int a;
28             scanf("%d",&a);
29             g[i][a] = g[a][i] = 1;
30         }
31     }
32     
33     return true;
34 }
35 
36 void floyd()
37 {
38     for(int i = 1;i <= 20;i ++)
39     {
40         for(int j = 1;j <= 20;j ++)
41         {
42             for(int k = 1;k <= 20;k ++)
43             {
44                 g[j][k] = std::min(g[j][k], g[j][i] +g[i][k]);
45             }
46         }
47     }
48 }
49 
50 int main()
51 {
52     int cas = 1;
53     while(init())
54     {
55         floyd();
56         scanf("%d",&n);
57         int a,b;
58         printf("Test Set #%d\n",cas ++);
59         for(int i = 1;i <= n;i ++)
60         {
61             scanf("%d%d",&a,&b);
62             printf("%2d to %2d: %d\n",a,b,g[a][b]);
63         }
64         printf("\n");
65 
66     }
67 
68     return 0;
69 }

 

 

posted on 2012-04-15 21:27  Shirlies  阅读(260)  评论(0编辑  收藏  举报