题目连接:http://poj.org/problem?id=1125
题目就是要求你算每个点在能够到达所有点的情况下求到达所有点的费时中最大的最小值及其起点,如果不能到达直接输出disjoint。
代码
View Code
1 #include <iostream> 2 #include <stdio.h> 3 #define max 1000000 4 using namespace std; 5 int map[106][105]; 6 void init(int n) 7 { 8 int i,j; 9 for(i = 1;i <= n;i++) 10 { 11 for(j = 1;j <= n;j++) 12 map[i][j] = max; 13 map[i][i] = 0; 14 } 15 } 16 void floyd(int n) 17 { 18 int k,i,j; 19 20 for(k = 1;k <= n;k++) 21 { 22 for(i = 1;i <= n;i++) 23 { 24 for(j = 1;j <= n;j++) 25 { 26 if(map[i][j] > map[i][k]+map[k][j]) 27 map[i][j] = map[i][k]+map[k][j]; 28 } 29 } 30 } 31 } 32 33 int main() 34 { 35 int n,m,v,t,ansi,i,j; 36 while(scanf("%d",&n)&&n) 37 { 38 init(n); 39 for(i = 1;i <= n;i++) 40 { 41 scanf("%d",&m); 42 while(m--) 43 { 44 scanf("%d%d",&v,&t); 45 map[i][v] = t; 46 47 } 48 49 } 50 floyd(n); 51 int leap = 1; 52 int ans,sub; 53 ans = max,sub = -1; 54 for(i = 1;i <= n;i++) 55 { 56 sub = -1; 57 for(j = 1;j <= n;j++) 58 { 59 if(map[i][j] > max &&i != j) 60 leap = 0; 61 else if(map[i][j] > sub &&i != j) 62 sub = map[i][j]; 63 } 64 65 if(sub < ans) 66 ans = sub,ansi = i; 67 } 68 69 if(leap) 70 printf("%d %d\n",ansi,ans); 71 else 72 puts("disjoint"); 73 74 75 } 76 return 0; 77 }