第一次做最短路径的题目。
大致是看别人的代码。不过多多少理解了。还要多多练习才行。
用过一个map二维数组来存储两点之间的权值。
首先输入人数个数num,然后在输入num行,第一行代表第一个人,第二行代表第二个人,每行第一个数位对数pair,然后分别输入pair对。例如:2 2 4 3 5 则表示有两对数据分别是2 4 和3 5 代表 第一个人传递到第二个人需要4个时间。第一个人传递给第三个人需要5个时间。对角为0,不能传到的为INT_MAX,即为最大值。需要include <limits.h>
用for循环将每个人(i)作为起点,然后算传播到每个人的时间,会得到一个dis[]数组,里面存有i号人传播到每个人的时间,求这时间的最大值,保存。然后求出循环n个人后这个时间最大值里面的最小值,如果有传播不到的,输出" disjoint "。否则输出从几号开始传播 以及最短传播到所有人的时间。
对于第一次做这种题目的我,感觉其中有包含着DP的思想。即每次都会更新两点之间的距离,dis[]。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <memory.h>
int main()
{
int i, j, k, x, n, num, mmax, pair, max, number, now, flag, temp;
int hash[1000], map[100][100], dis[1000];
while (scanf("%d", &num) && num)
{
for (i = 1; i <= num; i++)
for (j = 1; j <= num; j++)
map[i][j] = INT_MAX;
for (i = 1; i <= num; i++)
{
scanf("%d", &pair);
for (j = 1; j <= pair; j++)
{
scanf("%d %d", &x, &n);
map[i][x] = n;
}
map[i][i] = 0;
}
max = INT_MAX;
for (i = 1; i <= num; i++)
{
memset(hash, 0, sizeof(hash));
for (j = 1; j <= num; j++)
dis[j] = INT_MAX;
hash[i] = 1; now = i; dis[now] = 0; flag = 1;
for (j = 1; j <= num; j++)
{
mmax = INT_MAX;
for (k = 1; k <= num; k++)
if (map[now][k] != INT_MAX && dis[k] > dis[now] + map[now][k])
dis[k] = dis[now] + map[now][k];
for (k = 1; k <= num; k++)
if (!hash[k] && mmax > dis[k])
{
mmax = dis[k];
now = k;
}
hash[now] = 1;
}
for (j = 1; j <= num && flag; j++)
if (dis[j] == INT_MAX)
flag = 0;
temp = 0;
if (flag)
{
for (j = 1; j <= num; j++)
{
if (dis[j] > temp)
temp = dis[j];
}
if (temp < max)
{
max = temp;
number = i;
}
}
}
if (max == INT_MAX)
printf(" disjoint \n");
else
printf("%d %d\n", number, max);
}
return 0;
}
本文详细介绍了如何解决最短路径问题,通过实例演示使用二维数组存储边权重,并利用动态规划思想实现路径优化。
1万+

被折叠的 条评论
为什么被折叠?



