题意:
股票经纪人之间传递谣言. 给出一个股票经纪人的联系网络: a联系到b用时w.
求: 选择哪一个人作为谣言的源头可以使得谣言传到所有人最快, 以及传到所有人所用时间.
思路:
Floyd算法可以求出全源最短路. 只要枚举每一个源s, 记录s到其他人的最大时间t, 比较t, 最小的那个对应的s即为所求.
#include <cstdio> #include <cstring> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 105; int adj[MAXN][MAXN]; int n; void Floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(adj[i][j]>adj[i][k] + adj[k][j]) adj[i][j] = adj[i][k] + adj[k][j]; } int main() { while(scanf("%d",&n),n) { memset(adj,0x3f,sizeof(adj)); for(int i=1,m;i<=n;i++) { adj[i][i] = 0;//到自己的时间为0 scanf("%d",&m); for(int k=1,j,w;k<=m;k++) { scanf("%d %d",&j,&w); adj[i][j] = w; } } Floyd(); int s = 0,cost = INF; int tot; for(int i=1;i<=n;i++) { tot = 0; for(int j=1;j<=n;j++) { if(tot<adj[i][j]) tot = adj[i][j]; } if(tot<cost) { cost = tot; s = i; } } if(cost == INF) printf("disjoint\n"); else printf("%d %d\n",s,cost); } }
此题数据目测较弱= =