https://vjudge.net/problem/POJ-1125
题意:
题意不是很好理解,首先输入一个n,表示有n个股票经纪人,接下来输入n行,每行第一个数m为该股票经纪人认识的经纪人数,然后输入m对数(a,t),表示第i个经纪人把消息传给第a个经纪人所需要的时间。
计算将消息传遍所有人所需要的最少时间。
思路:
起点任意,用floyd比较好。因为floyd求出的是每两点之间的最短路,所以最后计算最小时间时,需要先取最大值,比如说1号经纪人为起点,因为谁都可能为终点,所以枚举所有人,将最大时间作为最小时间,这个应该不难理解。
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<cstring> 5 using namespace std; 6 7 const int maxn = 100 + 5; 8 const int INF = 0x3f3f3f3f; 9 10 int n; 11 int d[maxn][maxn]; 12 13 14 void floyd() 15 { 16 for (int k = 1; k <= n;k++) 17 for (int i = 1; i <= n;i++) 18 for (int j = 1; j <= n; j++) 19 d[i][j] = min(d[i][j], d[i][k] + d[k][j]); 20 } 21 22 int main() 23 { 24 //freopen("D:\\txt.txt", "r", stdin); 25 int x, a, t; 26 while (~scanf("%d", &n) && n) 27 { 28 for (int i = 1; i <= n; i++) 29 { 30 d[i][i] = 0; 31 for (int j = 1; j < i; j++) 32 d[i][j] = d[j][i] = INF; 33 } 34 35 for (int i = 1; i <= n; i++) 36 { 37 scanf("%d", &x); 38 while (x--) 39 { 40 scanf("%d%d", &a, &t); 41 d[i][a] = t; 42 } 43 } 44 45 floyd(); 46 int stock; 47 int ans = INF; 48 for (int i = 1; i <= n; i++) 49 { 50 int MAX = 0; 51 for (int j = 1; j <= n; j++) 52 { 53 if (i == j) continue; 54 MAX = max(MAX, d[i][j]); 55 } 56 if (ans > MAX) 57 { 58 ans = MAX; 59 stock = i; 60 } 61 } 62 if (ans == INF) 63 printf("disjoint\n"); 64 else 65 printf("%d %d\n", stock, ans); 66 } 67 return 0; 68 }
时间: 2024-11-09 03:15:57