典型的有向图,有权重,权重为正无负环,全源最短路径问题。所以没有任何问题用floyd算法
得到最小路径以后,如果每一行都至少含有一个无穷大的数,则表示disjoint
对于每一个可以到达全部其他点的点,得到一个它到达其他点的最大值,然后再在这些最大值中得到一个最小值即可。
不过这道题的数据貌似很弱很弱。
//2008-01-13 15:30:24 Accepted 1082 C++ 00:00.00 432K #include<stdio.h> #define MAXN 101 #define INFI 9999999 int map[MAXN][MAXN]; int main() { freopen(“1082.txt”,”r”,stdin); int n,m,i,j,k,t,tv; bool disjoin,rflag; int rmax,amin,key; while((scanf(“%d”,&n)!=EOF) && n!=0) { for(i=0;i<MAXN;i++) { for(j=0;j<MAXN;j++) { map[i][j] = INFI; } } for(i=0;i<MAXN;i++) map[i][i] = 0; for(i=1;i<=n;i++) { scanf(“%d”,&m); for(j=0;j<m;j++) { scanf(“%d %d”,&t,&tv); map[i][t] = tv; } } //floyd-begin for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { t = map[i][k] + map[k][j]; if(map[i][j]>t) map[i][j]=t; } } } //floyd-end disjoin=true; amin=INFI;key=0; for(i=1;i<=n;i++) { rflag=true; rmax = 0; for(j=1;j<=n;j++) { if(map[i][j]<INFI) { if(map[i][j]>rmax) rmax=map[i][j]; } else { rflag=false; break; } } if(rflag) { disjoin=false; if(rmax<amin) { amin=rmax; key = i; } } } if(disjoin) printf(“disjoint/n”); else printf(“%d %d/n”,key,amin); } fclose(stdin); return 0; }