http://poj.org/problem?id=1125
题意:给一个有向图,选一个起点,这个起点满足到达其他起点的时间的最大值最小。
图的顶点个数不超过100个,直接Floyd就完事。
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
int dis[105][105];
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int n;
while(~scanf("%d", &n)) {
if(n == 0)
break;
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
dis[i][j] = ((i == j) ? 0 : 0x3f3f3f3f);
}
}
for(int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
while(x--) {
int v, w;
scanf("%d%d", &v, &w);
dis[i][v] = min(dis[i][v], w);
//dis[v][i] = min(dis[v][i], w);
}
}
for(int k = 1; k <= n; ++k) {
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
int ansv = 0x3f3f3f3f;
int ansi = 0;
for(int i = 1; i <= n; ++i) {
int maxv = 0;
for(int j = 1; j <= n; ++j) {
if(dis[i][j] > maxv) {
maxv = dis[i][j];
}
}
if(maxv < ansv) {
ansv = maxv;
ansi = i;
}
}
if(ansv >= 1000000) {
puts("disjoint");
} else {
printf("%d %d
", ansi, ansv);
}
}
}