|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include<stdio.h>
- #define Max 0xFFFF
- #define n 38
- void floyd(int graph[n][n])//弗洛伊德求各顶点之间的最短路径
- {
- int dist[n][n];
- for (int i = 0; i < n; i++)//初始化距离矩阵
- {
- for (int j = 0; j < n; j++)
- dist[i][j] = graph[i][j];
- }
- for (int k = 0; k < 38; k++)//逐一考虑每个顶点作为中间顶点
- {
- for (int i = 0; i < 38; i++)//
- {
- for (int j = 0; j < 38; j++)
- {
- if (dist[i][j] > dist[i][k] + dist[k][j])//k作为中间顶点,可以缩短(i,j)的距离
- dist[i][j] = dist[i][k] + dist[k][j];
- }
- }
- }
- for (int i = 0; i < 38; i++)
- {
- for (int j = 0; j < 38; j++)
- {
- printf("%4.1f", dist[i][j]);
- }
- printf("\n");
- }
- }
- int main()
- {
- int graph[n][n] = { {0,6,13},{10,0,4} ,{5,Max,0} };
- floyd(graph);
- return 0;
- }
复制代码
为什么输出均为0?
这种情况下,程序输出为零是因为矩阵的声明和初始化有误。
在main函数中,矩阵的初始化方式有问题,你的目的肯定是想给一个3x3的矩阵进行初始化,但实际上你给的矩阵只在一部分区域进行了初始化,其他区域被隐式地初始化为零了。同时你在floyd函数中对于i和j的遍历上限都采用了常数38,远大于你的实际矩阵规模。
将main函数下的矩阵声明和初始化修改如下:
- int main()
- {
- int graph[3][3] = { {0,6,13},{10,0,4} ,{5,Max,0} };
- floyd(graph);
- return 0;
- }
复制代码
然后将floyd函数的4个循环数修改为
- for (int k = 0; k < 3; k++)
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++)
复制代码
由于你只有3x3的矩阵,故只需遍历3次。这样,你的程序就应该能产生正确的输出了。
|
|