题目链接。
分析:
手感不错,1A。
直接穷举的起点, 求出不同起点到其它点最短路中最长的一条的最小值(好绕)。
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; const int maxn = +;
const int INF = (<<); int n, G[maxn][maxn], d[maxn]; int dijkstra(int s) {
bool vis[maxn]; memset(vis, , sizeof(vis));
for(int i=; i<n; i++) {
d[i] = G[s][i];
}
d[s] = ; vis[s] = true; for(int i=; i<n-; i++) {
int x, m = INF;
for(int y=; y<n; y++) if(!vis[y] && m >= d[y]) m = d[x=y];
vis[x] = true;
for(int y=; y<n; y++) if(!vis[y] && d[y] > d[x]+G[x][y]) {
d[y] = d[x] + G[x][y];
}
} int ans = -;
for(int i=; i<n; i++) {
if(i == s) continue;
ans = max(ans, d[i]);
} return ans;
} int main() {
int m, v, c; while(scanf("%d", &n) == && n != ) {
for(int i=; i<n; i++)
for(int j=; j<n; j++)
G[i][j] = INF; for(int u=; u<n; u++) {
scanf("%d", &m);
for(int i=; i<m; i++) {
scanf("%d %d", &v, &c);
v--;
G[u][v] = c;
}
} int ans = INF, k;
for(int i=; i<n; i++) {
int res = dijkstra(i);
if(res == -) {
ans = -; break;
}
else if(ans > res) {
ans = res;
k = i;
}
} if(ans != INF) printf("%d %d\n", k+, ans);
else printf("disjoint\n");
} return ;
}