floyd 算法的应用,一开始把三重循环的次序写错了,wa了好长一段时间!注意k的那层循环一定要放到外边
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int map[105][105];
int main()
{
int n,i,j,k,c,cid,clen;
int ansid,ans;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=20000;
for(i=1;i<=n;i++)
map[i][i]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&c);
for(j=1;j<=c;j++)
{
scanf("%d%d",&cid,&clen);
map[i][cid]=clen;
}
}
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(map[i][j]>(map[i][k]+map[k][j])){
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
ansid=1;
ans=20000;
for(i=1;i<=n;i++)
{
clen=0;
for(j=1;j<=n;j++)
{
if(map[i][j]>clen){
clen=map[i][j];
}
}
if(clen<ans){
ans=clen;
ansid=i;
}
}
if(ans==20000){ printf("disjoint\n");}
else{ printf("%d %d\n",ansid,ans);}
}
return 0;
}