题意:
有n个传递消息者,每个都有nn个亲信,他们可以把消息传递给他们的亲信,所 花时间为b。
问把最初的消息传递给谁可以在最短的时间内把消息传递给所有人。
思路:
Floyd算出任意两点之间的最短路,然后取每行最大值最小的矩阵作为首先传递出消息的人,将最大值作为把消息传递给所有人最短的时间。
#include<stdio.h> #include<string.h> const int inf=99999999; int pho[105][105]; int main() { int n,nn; int a,b; scanf("%d",&n); while(n>0) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { pho[i][j]=inf; } pho[i][i]=0; } for(int i=1;i<=n;i++) { scanf("%d",&nn); for(int j=1;j<=nn;j++) { scanf("%d%d",&a,&b); pho[i][a]=b; } } for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(pho[i][j]>pho[i][k]+pho[k][j]) { pho[i][j]=pho[i][k]+pho[k][j]; } } } } int ans=inf; int minans=inf; for(int i=1;i<=n;i++) { int mmm=-1; for(int j=1;j<=n;j++) { if(mmm<pho[i][j]) { mmm=pho[i][j]; } } if(minans>mmm) { minans=mmm; ans=i; } } printf("%d %d ",ans,minans); scanf("%d",&n); } }