题意:股票经纪人传递消息,消息可以同时传播,输入传递信息的人数,然后每一行开头输入一个t,随后有t对数k h,代表了这个股票经纪人把消息传播给k需要的时间是h.求让哪个股票经纪人传播消息,可以把消息最快传播到每一个人那里。
思路:Flyod把
dist[i][j]每两个人传播消息耗费的最小时间矩阵求出来,然后每一行求出最大的时间代表了,这个人把消息传播出去所用的最大时间(至少用这么多的时间他才能把消息传给每一个人),然后比较这些时间,求出其中最小的时间,和其所在的行。
#include<iostream>
using namespace std;
int dist[105][105];
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(dist[i][k]+dist[k][j]<dist[i][j])
dist[i][j]=dist[i][k]+dist[k][j];
}
int main()
{
int t,k;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dist[i][j]=100000;
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&k);
scanf("%d",&dist[i][k]);
}
}
floyd();
int ans,min_c=100000;
for(int i=1;i<=n;i++)
{
dist[i][i]=0;
int max_r=0;
for(int j=1;j<=n;j++)
if(dist[i][j]>max_r)
max_r=dist[i][j];
if(max_r<min_c)
{
ans=i;
min_c=max_r;
}
}
printf("%d %d\n",ans,min_c);
}
}