題意:
股票經紀人之間傳遞謠言. 給出一個股票經紀人的聯系網絡: 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);
}
}