您的位置:首页 > 其它

Floyd算法解决最短路径问题

2015-09-18 13:58 405 查看
本文给出了用Floyd算法来求最短路径问题的程序。

输入如下所示:

1 —————–测试用例个数

10 —————–本测试用例的点数

1 2 4 ——————第一个点和第二个点之间的距离是4.

1 3 8

2 3 3

2 4 4

2 5 6

3 4 2

3 5 2

4 5 4

4 6 9

5 6 4

代码如下

#include <stdio.h>
#define MAX 6
#define MAX_VALUE 65536

int v[MAX + 1][MAX + 1] = { 0 };
int p[MAX + 1][MAX + 1] = { 0 };
void Floyd()
{
v[1][1] = 0;
for (int k = 1; k <= MAX; k++)
for (int i = 1; i <= MAX; i++)
for (int j = 1; j <= MAX; j++)
if (v[i][k] + v[k][j]<v[i][j])
{
v[i][j] = v[i][k] + v[k][j];
p[i][j] = k;
}
}

void initV(void)
{
for (int i = 1; i <= MAX; i++)
for (int j = 1; j <= MAX; j++)
{
v[i][j] = MAX_VALUE;
}
}
void printPathFloyd()
{
printf("%d\n", v[1][6]);
int path[10];
int end = 0;
int curValue = 6;
while (curValue != 0)
{
path[end++] = curValue;
curValue = p[1][curValue];
}
for (int j = end - 1; j >= 0; j--)
{
printf("%d ", path[j]);
}
printf("\n");
}

int main(int argc, char** argv)
{
freopen("input.txt", "r", stdin);
int N;
scanf("%d\n", &N);

for (int case_num = 0; case_num < N; case_num++)
{
initV();
int line_num;
scanf("%d\n", &line_num);
for (int i = 0; i < line_num; i++)
{
int pt1, pt2, length;
scanf("%d %d %d", &pt1, &pt2, &length);
v[pt1][pt2] = length;
v[pt2][pt1] = length;
}
Floyd();
printPathFloyd();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: