这是一道非常基本的最短路问题,使用floyd算法。这是我第一次写floyd,对算法还不甚了解,第一次写的时候将本应该是k,i,j的循环写成了i,j,k,于是WA了一会儿,后来对照别人的代码发现了这个问题,但是我还没明白为什么是k,i,j。这一点一定要在最近弄清楚,否则就成了背算法而不是学算法,我应该它理解才行。
#include<stdio.h> #include<string.h> #define max_vertx 200 #define infnty 1000000000 int data[max_vertx][max_vertx]; int main() { int n; while(scanf("%d",&n),n) { int i,j,k,to,min_from=0,tmax=0,min=infnty; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i!=j) data[i][j]=infnty; else data[i][j]=0; } } for(i=0;i<n;i++) { scanf("%d",&to); for(j=0;j<to;j++) { int a,b; scanf("%d%d",&a,&b); data[i][a-1]=b; } } for(k=0;k<n;k++) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(data[i][k]+data[k][j]<data[i][j]) { data[i][j]=data[i][k]+data[k][j]; } } } } for(i=0;i<n;i++) { tmax=0; for(j=0;j<n;j++) { if(tmax<data[i][j]) { tmax=data[i][j]; } } if(tmax<min) { min=tmax; min_from=i; } } if(min!=infnty) printf("%d %d\n",min_from+1,min); else printf("disjoint\n"); } return 0; }