题目大意是:有N个人,相互之间可以传递信息,但是A传给B与B传给A的时间是不一样的,一个人同时可以向多个人传递信息,时间不一样,问你把消息传给谁?可以在最短时间让消息传递给所有人。
典型的FLOYD求最短路,最后找到所有人距离最大之最小那一个人,输出答案。
#include<stdio.h> #include<stdlib.h> #include<string.h> const int maxn=110,maxint=1000000000; int d[maxn][maxn]; int main(){ int i,j,k,m,n; int x,y; while(1){ scanf("%d",&n); if(!n)break; for(i=1;i<=n;i++) for(j=1;j<=n;j++) d[i][j]=maxint; for(i=1;i<=n;i++){ scanf("%d",&m); for(j=1;j<=m;j++){ scanf("%d%d",&x,&y); d[i][x]=y; } } for(i=1;i<=n;i++)d[i][i]=0; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j]; int mins=maxint,maxs; for(i=1;i<=n;i++){ maxs=0; for(j=1;j<=n;j++) if(d[i][j]>maxs) maxs=d[i][j]; if(maxs<mins){ mins=maxs; k=i; } } printf("%d %d ",k,mins); } return 0; }