POJ_1125_Stockbroker Grapevine(最短路径 Floyd算法)

/*
从每一个点向外扩散,如果两点i,j有多条路径可达记录更新e[i][j]i到j的最短路径
如果不可达则e[i][j]=inf.因此在最后遍历的时候,如果每一个点都有不可达的点
那么就输出disjoint。注意简介可达的点也是可达的。因为已经赋值了。
所以便利的时候只要找这些。。。
*/

 1 # include <stdio.h>
 2 # include <string.h>
 3 const int inf=1<<19;
 4 int e[100][100];
 5 int n;
 6 void Floyd()
 7 {
 8     int i,j,k;
 9     for(k=1;k<=n;k++)
10         for(i=1;i<=n;i++)      //
11             for(j=1;j<=n;j++)  //这里不能用for(j=i+1;j<n;j++),因为这里是有向图。并不具有对称性。
12             {
13                 if(i!=j && e[i][j]>e[i][k]+e[k][j]) //i!=j是因为无向图的顶点(一般)不存在环 
14                     e[i][j]=e[i][k]+e[k][j];
15             }
16     int flag;
17     int min=inf,max;
18     for(i=1;i<=n;i++)
19     {
20         max=0;
21         for(j=1;j<=n;j++) //寻找i到j的最长的路径.可能会有疑问就是为什么两点的可达性就能保证所有点可达。
22                         // 因为Floyd算法在修改的时候已经可达给记录了。就是说虽然i到j直接不可达,但是
23                         //i到j间接可达也是会记录的。
24             if(i!=j && max < e[i][j])
25                 max=e[i][j];
26         if(min>max)
27         {
28             min=max;
29             flag=i;
30         }
31     }
32     if(min>=inf)
33         printf("disjoint\n");
34     else 
35         printf("%d %d\n",flag,min);
36 }
37 int main()
38 {
39     int i,j,k,x,time,l;
40     while(scanf("%d",&n) != EOF)
41     {
42         if(!n)break;
43     //    memset(e,inf,sizeof(e));  
44         for(i=0;i<100;i++)
45             for(j=0;j<100;j++)//数组千万不能越界。
46                 e[i][j]=inf;
47     
48         for(i=1;i<=n;i++)
49         {
50             scanf("%d",&x);
51             for(j=1;j<=x;j++)
52             {
53                 scanf("%d%d",&l,&time);
54                 e[i][l]=time;
55             }
56         }
57         Floyd();
58     }
59     return 0;
60 }

 

 

posted on 2013-08-15 17:26  随风浪子的博客  阅读(110)  评论(0编辑  收藏  举报

导航