题目大意
N个股票经纪人,每个股票经纪人都会将得到的消息传播给另外一些股票经纪人,传播的速度均不固定,且从A传到B的速度和B传到A的速度不一定相等。给定一个消息,并不一定能够传遍所有的股票经纪人,因为股票经纪人可能形成一座座“孤岛”,使得信息无法送达。
现在给定每个股票经纪人能消息传达的其他股票经纪人和传达给其他经纪人所需要的时间,求出将一个消息给哪个(只一个)股票经纪人能够使得消息最快传遍所有的股票经纪人。若无论给哪个股票经纪人都无法使消息传遍所有经纪人,则返回 "disjoint".
思路:这是一道floyd算法的模板题。。。。
#include<cstdio>
#include<cstring>
#define inf 1<<29
#define min(x,y) x<y? x:y
#define max(x,y) x>y? x:y
using namespace std;
int map[105][105];
int main()
{
int i,j,n,t,v,s,k,temp,nn,tt;
while(scanf("%d",&n)){
if(n==0) break;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(i==j) map[i][j]=0;
else
map[i][j]=inf;
}
for(i=1;i<=n;i++){
scanf("%d",&t);
for(j=0;j<t;j++){
scanf("%d%d",&v,&s);
map[i][v]=s;
}
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
temp=inf;
for(i=1;i<=n;i++){
tt=-1;
for(j=1;j<=n;j++){
tt=max(map[i][j],tt);
}
if(tt<temp){
temp=tt;
nn=i;
}
}
if(temp==inf) printf("disjoint\n");
else
printf("%d %d\n",nn,temp);
}
return 0;
}