即,每次松弛时,记录是松弛了哪一个点.然后输出时递归输出即可.
弄一个矩阵R[][]初始化为0,然后比如你的距离矩阵是D[][]
松弛改为是:
if(D[i][j] >D[i][k]+D[k][j]){
D[i][j] = D[i][k]+D[k][j]
R[i][j] = k
}
输出时可以写一个递归函数
function out(a,b){
if(R[a][b] == 0){
return
}
out(a,R[a][b])
//输出k
out(R[a][b],b)
}
#include <stdio.h>
#define MAXNODE 108
int path[MAXNODE + 1][MAXNODE + 1] = {0}
int main(void)
{
FILE *fpr, *fpw
int va, vb, i, j, k
fpr = fopen("in.txt", "r") /* 读取的文件名称in.txt */
fpw = fopen("out.txt", "w") /* path的数据在out.txt中展现 */
while (fscanf(fpr, "%d%d", &va, &vb) != EOF)
path[va][vb] = path[vb][va] = 1
for (k = 1 k <= MAXNODE ++k) {
for (i = 1 i <= MAXNODE ++i) {
for (j = 1 j <= MAXNODE ++j) {
if (!path[i][k] || !path[k][j])
continue
if (!path[i][j])
path[i][j] = path[i][k] + path[k][j]
else if (path[i][j] > path[i][k] + path[k][j])
path[i][j] = path[i][k] + path[k][j]
}
}
}
for (i = 1 i <= MAXNODE ++i) {
for (j = 1 j <= MAXNODE ++j) {
if (i == j)
fprintf(fpw, "%-10d", 0)
else if (path[i][j])
fprintf(fpw, "%-10d", path[i][j])
else
fprintf(fpw, "%-10d", -1)
}
fprintf(fpw, "\n")
}
return 0
}
注意:floyd算法中k为最外层,这是动态规划的思想,不能改变i,j,k的顺序!!!
这是之前的答案的错误之处。
-1表示不通。
具体程序分析,我可以加你QQ,愿意的话,你把QQ写给我。