http://poj.org/problem?id=1125
最短路问题
题目大意:给出一组顶点和各顶点到达其他的直接距离,求每个点到其他点的最短距离中的最大值,然后在这些点里面最大值里面的最小值,注意这个点要是能到达其他每个点。
解题思路:floyd算法求出每对点之间的最小值,然后枚举每个顶点,就这个顶点到其他点的距离中的最大值,而且要保证这个顶点都能到达其他每个点,求这些最大值里面的最小值和相应顶点。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N,G[110][110];
void Floyd(){
for(int k=1; k<=N; k++)
for(int i=1; i<=N; i++)
for(int j=0; j<=N; j++){
if(i == j) continue;//!
if(G[i][j] > G[i][k] + G[k][j])
G[i][j] = G[i][k] + G[k][j];
}
}
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d",&N) != EOF){
if(!N) break;
for(int i=1; i<=N; i++){
for(int j=1; j<=N; j++){
G[i][j] = 1e9;
}
G[i][i] = 0;
}
int m;
for(int i=1; i<=N; i++){
scanf("%d",&m);
int to,cost;
for(int j=1; j<=m; j++){
scanf("%d%d",&to,&cost);
G[i][to] = min(G[i][to], cost);
}
}
Floyd();
int ans = 1e9, id = 1;
for(int i=1; i<=N; i++){///枚举顶点
int tmp = 0;
for(int j=1; j<=N; j++){
if(i == j) continue;
if(G[i][j] > tmp)
tmp = G[i][j];
}//tmp存储的是从顶点i传完的时间
if(tmp < ans){
ans = tmp;
id = i;
}
}
if(ans == 1e9) puts("disjoint");
else printf("%d %d\n",id, ans);
}
return 0;
}