题意是在n个股票经纪人之间散播谣言,从 i 到 j 传到需要 t 秒,问选定那个股票经纪人可以是谣言最快的使所有人都知道,并求出这个时间。
直接floyd,遍历即可。
#include <stdio.h> #define INF 10000 int n,m,dist[110][110]; void floyd() { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(dist[i][j]>dist[i][k]+dist[k][j]) dist[i][j]=dist[i][k]+dist[k][j]; } int main() { int i,j,k,t; int min,temp,pe; while(1) { scanf("%d",&n); if(n==0) break; for(i=1;i<=n;i++) for(j=1;j<=n;j++) dist[i][j]=INF; for(i=1;i<=n;i++) { scanf("%d",&m); for(j=1;j<=m;j++) { scanf("%d%d",&k,&t); dist[i][k]=t; } } floyd(); min=INF; for(i=1;i<=n;i++) { temp=-1; for(j=1;j<=n;j++) { if(i==j) continue; if(dist[i][j]>temp) temp=dist[i][j]; } if(temp<min) { min=temp; pe=i; } } if(min<INF) printf("%d %d ",pe,min); else printf("disjoint "); } return 0; }