标准的最短路径模板题目
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int inf=20;
int dist[101][101];
int i,j,k;
int n; //经纪人个数
void floyd()
{
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) //floyd 0(n^3);
if(i!=j && dist[i][j] > dist[i][k] + dist[k][j])
dist[i][j] = dist[i][k] + dist[k][j];
int maxlength;
int min_in_max=inf;
int flag_source;
for(i=1;i<=n;i++) //以i点作为各通路源点
{
maxlength=0;
for(j=1;j<=n;j++)
if(i!=j && maxlength<dist[i][j]) //寻找到达最远的人用的时间
maxlength=dist[i][j];
if(min_in_max>maxlength)
{
min_in_max=maxlength; //寻找所有最长时间中的最短时间
flag_source=i; //该短路所在路径的源点记录
}
}
if(min_in_max<inf)
cout<<flag_source<<' '<<min_in_max<<endl;
else
cout<<"disjoint"<<endl;
return;
}
int main()
{
while(cin>>n)
{
memset(dist,inf,sizeof(dist));
if(n==0)
{
break;
}
for(i=1;i<=n;i++)
{
int p;
cin>>p;//直接接触的人的数目
for(j=1;j<=p;j++)
{
int m,time; //i的接触人,接触时间(边权)
cin>>m>>time;
dist[i][m]=time;
}
}
floyd();
}
return 0;
}