鱼C论坛

 找回密码
 立即注册
查看: 264|回复: 3

[已解决]弗洛伊德算法输出问题

[复制链接]
发表于 2023-12-18 17:20:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #define Max 0xFFFF
  3. #define n 38

  4. void floyd(int graph[n][n])//弗洛伊德求各顶点之间的最短路径
  5. {
  6.         int dist[n][n];
  7.         for (int i = 0; i < n; i++)//初始化距离矩阵
  8.         {
  9.                 for (int j = 0; j < n; j++)
  10.                         dist[i][j] = graph[i][j];
  11.         }
  12.         for (int k = 0; k < 38; k++)//逐一考虑每个顶点作为中间顶点
  13.         {
  14.                 for (int i = 0; i < 38; i++)//
  15.                 {
  16.                         for (int j = 0; j < 38; j++)
  17.                         {
  18.                                 if (dist[i][j] > dist[i][k] + dist[k][j])//k作为中间顶点,可以缩短(i,j)的距离
  19.                                         dist[i][j] = dist[i][k] + dist[k][j];
  20.                         }
  21.                 }
  22.         }
  23.         for (int i = 0; i < 38; i++)
  24.         {
  25.                 for (int j = 0; j < 38; j++)
  26.                 {
  27.                         printf("%4.1f", dist[i][j]);
  28.                 }
  29.                 printf("\n");
  30.         }
  31. }

  32. int main()
  33. {
  34.         int graph[n][n] = { {0,6,13},{10,0,4} ,{5,Max,0} };
  35.         floyd(graph);
  36.         return 0;
  37. }
复制代码


为什么输出均为0?
最佳答案
2023-12-18 17:30:23
这种情况下,程序输出为零是因为矩阵的声明和初始化有误。

在main函数中,矩阵的初始化方式有问题,你的目的肯定是想给一个3x3的矩阵进行初始化,但实际上你给的矩阵只在一部分区域进行了初始化,其他区域被隐式地初始化为零了。同时你在floyd函数中对于i和j的遍历上限都采用了常数38,远大于你的实际矩阵规模。

将main函数下的矩阵声明和初始化修改如下:


  1. int main()
  2. {
  3.     int graph[3][3] = { {0,6,13},{10,0,4} ,{5,Max,0} };
  4.     floyd(graph);
  5.     return 0;
  6. }
复制代码


然后将floyd函数的4个循环数修改为
  1. for (int k = 0; k < 3; k++)
  2. for (int i = 0; i < 3; i++)
  3. for (int j = 0; j < 3; j++)
复制代码

由于你只有3x3的矩阵,故只需遍历3次。这样,你的程序就应该能产生正确的输出了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-18 17:21:06 | 显示全部楼层
您的代码有几个问题导致输出都为0:

1. 在初始化距离矩阵时,没有正确赋值给`dist`变量。应该将`dist = graph[j]`。

2. 在主循环中,计算最短路径时,用到了错误的距离参量。应该将`dist`改为`graph[k]+graph[k][j]`。

3. 在输出结果时,使用了错误的变量`dist`,应该输出`graph[j]`。

修正后的代码如下所示:
  1. #include <stdio.h>
  2. #define Max 0xFFFF
  3. #define n 38
  4. void floyd(int graph[n][n])//弗洛伊德求各顶点之间的最短路径
  5. {
  6.     int dist[n][n];
  7.     for (int i = 0; i < n; i++)//初始化距离矩阵
  8.     {
  9.         for (int j = 0; j < n; j++)
  10.             dist[i][j] = graph[i][j];
  11.     }
  12.     for (int k = 0; k < n; k++)//逐一考虑每个顶点作为中间顶点
  13.     {
  14.         for (int i = 0; i < n; i++)
  15.         {
  16.             for (int j = 0; j < n; j++)
  17.             {
  18.                 if (dist[i][j] > dist[i][k] + dist[k][j])//k作为中间顶点,可以缩短(i,j)的距离
  19.                     dist[i][j] = dist[i][k] + dist[k][j];
  20.             }
  21.         }
  22.     }
  23.     for (int i = 0; i < n; i++)
  24.     {
  25.         for (int j = 0; j < n; j++)
  26.         {
  27.             printf("%4d", dist[i][j]);
  28.         }
  29.         printf("\n");
  30.     }
  31. }
  32. int main()
  33. {
  34.     int graph[n][n] = {
  35.         {0,   6,   13},
  36.         {10,  0,   4},
  37.         {5,   Max, 0}
  38.     };
  39.     floyd(graph);
  40.     return 0;
  41. }
复制代码

修正后的代码中,修正了距离矩阵的赋值以及计算最短路径的错误,并且输出结果已改为打印`dist`而不是原本的`graph`。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-18 17:30:23 | 显示全部楼层    本楼为最佳答案   
这种情况下,程序输出为零是因为矩阵的声明和初始化有误。

在main函数中,矩阵的初始化方式有问题,你的目的肯定是想给一个3x3的矩阵进行初始化,但实际上你给的矩阵只在一部分区域进行了初始化,其他区域被隐式地初始化为零了。同时你在floyd函数中对于i和j的遍历上限都采用了常数38,远大于你的实际矩阵规模。

将main函数下的矩阵声明和初始化修改如下:


  1. int main()
  2. {
  3.     int graph[3][3] = { {0,6,13},{10,0,4} ,{5,Max,0} };
  4.     floyd(graph);
  5.     return 0;
  6. }
复制代码


然后将floyd函数的4个循环数修改为
  1. for (int k = 0; k < 3; k++)
  2. for (int i = 0; i < 3; i++)
  3. for (int j = 0; j < 3; j++)
复制代码

由于你只有3x3的矩阵,故只需遍历3次。这样,你的程序就应该能产生正确的输出了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-19 11:49:33 | 显示全部楼层
sfqxx 发表于 2023-12-18 17:30
这种情况下,程序输出为零是因为矩阵的声明和初始化有误。

在main函数中,矩阵的初始化方式有问题,你的 ...

可是我对一部分区域进行初始化,按理说输出也不会都为0呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 14:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表