题目大意:
一群股票经纪人只信任自己的同事,给出经纪人之间的关系,和他们之间交流的时间,计算出通知何人能使得所有人都得到消息的所用时间最短,这个时间用最后一个人得到信息的时间来衡量。
看来就是一个最短路了。简单的FLOYD算法,注意最后找最短路径最长路段中最小值(比较拗口..),这个部分的计算,容易做错。
#include<iostream>
using namespace std;
const int INF=999999;
const int MAX=110;
int main()
{
int max=-1;
int person;
bool flag;
int n;
int min=INF;
int i,j,k;
int nv,ne;
int f,t;
int dist[MAX][MAX];
while(cin>>n&&n!=0)
{
for(j=0;j<MAX;j++)
{
for(i=0;i<MAX;i++)
{
dist[i][j]=INF;
if(i==j)
dist[i][j]=0;
}
}
for(i=1;i<=n;i++)
{
cin>>ne;
for(j=0;j<ne;j++)
{
cin>>t;
cin>>dist[i][t];
}
}
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];
}
}
}
min=INF;
for(i=1;i<=n;i++)
{
max=-1;
for(j=1;j<=n;j++)
{
if(max<dist[i][j])
max=dist[i][j];
}
if(min>max)
{
person=i;
min=max;
}
}
if(min==INF)
cout<<"disjoint"<<endl;
else
cout<<person<<" "<<min<<endl;
}
}