Floyd水过。。。
问题转化成求有向图中一点,使得该点能够到其他所有顶点,并且使得到其他点的每条最短路径的最大长度最小。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 99999999
using namespace std;
int main()
{
int n,i,j,k,map[120][120],dist[120][120],t,t1,t2,cnt;
while (1)
{
scanf("%d",&n);
if (n == 0)
break;
for (i=1; i<=n; i++)
{
for (j=1; j<=n; j++)
{
map[i][j]=maxn;
}
}
for (i=1; i<=n; i++)
{
scanf("%d",&t);
for (j=1; j<=t; j++)
{
scanf("%d%d",&t1,&t2);
map[i][t1]=t2;
}
map[i][i]=0;
}
for (k=1; k<=n; k++)
{
for (i=1; i<=n; i++)
{
for (j=1; j<=n; j++)
{
if (map[i][k]+map[k][j] < map[i][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
t1=1;
t2=maxn;
for (i=1; i<=n; i++)
{
cnt=-1;
for (j=1; j<=n; j++)
{
if (map[i][j] == maxn)
{
break;
}
if (cnt < map[i][j])
cnt=map[i][j];
}
if (j == n+1)
{
if (t2 > cnt)
{
t1=i;
t2=cnt;
}
}
}
if (t2 == maxn)
printf("disjoint\n");
else
printf("%d %d\n",t1,t2);
}
}