链接: POJ 1125
题意:给顶点数 n ,接下来有 n 行,第 i 行开始一个数 k ,代表该行接下来 k 组数据,每组数据两个数,t , d,代表从 i 到 t 距离为 d,问从哪一个顶点出发,使该点到图中最远的顶点的距离最小。输出顶点编号和最远距离。
思路:多源最短路,用 Floyd 就好。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
#define maxn 150
#define INF 0x3f3f3f3f
int n,map[maxn][maxn];
void init()
{
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j)
map[i][j] = i==j?0:INF;
for(int i = 1;i <= n;++i)
{
int k,t1,t2;
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&t1,&t2);
map[i][t1] = t2;
}
}
}
void floyd()
{
for(int k = 1;k <= n;++k)
{
for(int i = 1;i <= n;++i)
{
for(int j = 1;j <= n;++j)
{
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
void print()
{
int ans = INF,aa = 0;
for(int i = 1;i <= n;++i)
{
int t = 0;
for(int j = 1;j <= n;++j)
{
if(map[i][j] > t) t = map[i][j];
}
if(t < ans)
{
ans = t;
aa = i;
}
}
cout<<aa<<' '<<ans<<endl;
}
int main()
{
while(scanf("%d",&n)&&n)
{
init();
floyd();
print();
}
}