POJ 1125 Floyd
来源:互联网 发布:爱编程 编辑:程序博客网 时间:2024/05/20 08:24
题目大意: 直接用 输入示例说明吧, 32 2 4 3 52 1 2 3 62 1 2 2 2 表示 第一行表示一个股票经纪人需要向三个人传消息,第二行表示 第一个人有两个朋友, 向第二个朋友传消息需要 时间4 ,向第三个朋友发消息需要时间 5,第二行表示 第二个人有两个朋友,向第一个人传消息需要时间2,向第三个人传消息需要时间 6,第三行同样。 求 能够 向所有人都传到消息并且需要的时间最短的人,以及 这个人向某个人传消息所花的最多的时间。 输出 3 2 。 即表示 让第三个人传消息 所需的时间最短, 他 向其他人传消息最多的一次用了 时间2。 如果没有人可以 向所有人传递消息,输出 disjoint 解题思路: Floyd 算法。 即穷举断点 ,不断更新两点之间的 最小 距离。 装态转移方程 map[i,j]:=min{map[i,k]+map[k,j],map[i,j]} 。k表示 穷举得断点。#include <stdio.h> #define INF 100000 //无穷大 int num, a[101][101]; void Floyd() //Floyd算法求最短路径 { int i, j, k; //特别注意:循环的k,i,j的顺序不能改变。我测试过把顺序改为i,j,k就错了。 for (k=1; k<=num; k++) for (i=1; i<=num; i++) for (j=1; j<=num; j++) if (a[i][k]+a[k][j] < a[i][j]) a[i][j] = a[i][k] + a[k][j]; return; } int main() { int i, j; int m, contact, time, minTime, sum, max,person; while (scanf("%d", &num) && num) { for (i=1; i<=num; i++) for (j=1; j<=num; j++) { if (i != j) a[i][j] = INF; else a[i][j] = 0; } for (i=1; i<=num; i++) { scanf("%d", &m); for (j=1; j<=m; j++) { scanf("%d %d", &contact, &time); a[i][contact] = time; } } Floyd(); //调用Floyd函数 minTime = INF; for (i=1; i<=num; i++) { sum = 0; int tmax=0; for (j=1; j<=num; j++) { sum+=a[i][j]; if(a[i][j]>tmax) tmax=a[i][j]; //if(sum>=INF) break; } if (sum < minTime) { minTime = sum; person = i; max=tmax; } } if (minTime != INF) printf("%d %d\n", person, max); else printf("disjoint\n"); } return 0;}