题目大意: 直接用 输入示例说明吧,
3
2 2 4 3 5
2 1 2 3 6
2 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;
}
POJ 1125 Floyd
最新推荐文章于 2020-07-01 00:14:53 发布