第一道Floyd的题……
#include<iostream>
#include<cstdio>
using namespace std;
#define inf 10000
int adj[101][101];
void Floyd(int n)
{
int i, j, k;
for( k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(adj[i][k]+adj[k][j]<adj[i][j] )
adj[i][j]=adj[i][k]+adj[k][j];
}
int main()
{
int n, number;
int point, time;
int max, min, num;
int i, j, k;
while( cin>>n && n)
{
for(i=1; i<=n; i++)//初始化
{
for(j=1; j<=n; j++)
{
if( i!=j) adj[i][j]=inf;
else adj[i][j]=0;
}
}
for( i=1; i<=n; i++)
{
cin>>number;
while( number-- )
{
cin>>point>>time;
adj[i][point]=time;
}
}
Floyd( n );
min=inf;
for(i=1; i<=n; i++)
{
max=0;
for(j=1; j<=n; j++)
{
if( max<adj[i][j])
max=adj[i][j];
}
if( max<min)//只要存在一个max<inf就说明每个人都可得到消息
{
min=max;
num=i;
}
}
if (min!=inf)
printf("%d %d\n", num, min);
else
printf("disjoint\n");
}
}