http://poj.org/problem?id=1125
全源最短路问题:Floyd算法的简单应用!
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXV = 110;
const int INF = 0x3f3f3f3f;
int G[MAXV][MAXV],n;
void Init(){
for(int i=0; i<MAXV; i++){
for(int j=0; j<MAXV; j++)
G[i][j] = INF;
G[i][i] = 0;
}
}
void Floyd(){
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(G[i][j] > G[i][k] + G[k][j])
G[i][j] = G[i][k] + G[k][j];
}
int main(){
while(scanf("%d",&n) && n){
Init();
for(int i=1; i<=n; i++){
int m;
scanf("%d",&m);
for(int j=0; j<m; j++){
int a,b;
scanf("%d%d",&a,&b);
G[i][a] = min(b, G[i][a]);
}
}
//cout << "====================================================" << endl;
Floyd();
int id, ans = INF;
for(int i=1; i<=n; i++){
int tmp = -INF;
for(int j=1; j<=n; j++)
tmp = max(G[i][j], tmp);
if(ans > tmp){
ans = tmp;
id = i;
}
}
if(ans == 0x3f3f3f3f){
cout << "disjoint" << endl;
continue;
}
cout << id << " " << ans << endl;
}
//system("pause");
return 0;
}