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 }