思路:
题目给我们一些边,让我们算出通过哪个点以最快的速度遍历图中每个点。
很容易想到floyed。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int map[105][105];
int n , a , b , m;
int main(){
while(~scanf("%d" , &n)){
if(n == 0) break;
for(int i = 1 ; i <=n ; i ++){
for(int j = 1 ; j <=n ; j ++){
map[i][j] = 0x3f3f3f3f;
}
}
for(int i = 1 ; i <= n ; i ++){
scanf("%d" , &m);
for(int j = 1 ; j <= m ; j ++){
scanf("%d%d" , &a , &b);
map[i][a] = b;
}
}
for(int k = 1 ; k <= n ; k ++){
for(int i = 1 ; i <= n ; i ++){
for(int j = 1 ; j <= n ; j ++){
if(i != j && map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
}
}
}
int t = 0x3f3f3f3f;
int temp;
bool flag;
int ans , tt;
for(int i = 1 ; i <= n ; i ++){
temp = 0;
flag =true;
for(int j = 1 ; j <= n ; j ++){
if(i != j){
if(map[i][j] == -1){
flag = false;
}
if(temp < map[i][j]){
temp = map[i][j];
}
}
}
if(flag == false) map[i][0] = -1;
else map[i][0] = temp;
}
/*printf("--------------\n");
for(int i = 1 ; i <= n ; i ++){
for(int j = 0 ; j <= n ; j ++){
printf("%d " , map[i][j]);
}
printf("\n");
}*/
ans = t;
for(int i = 1 ; i <= n ; i ++){
if(map[i][0] < ans && map[i][0] != -1){
ans = map[i][0];
tt = i;
}
}
if(ans == t){
printf("disjoint\n");
}
else{
printf("%d %d\n" , tt , ans);
}
}
return 0;
}