关于Floyd最短路径的path图的生成问题

来源:互联网 发布:淘宝返利是怎么回事 编辑:程序博客网 时间:2024/05/29 12:32

前段时间在做寻路算法,发现网上的有关Floyd的教程虽然很详细,但是结果却有误差,搜了很多帖子,核心算法都是这样一行代码:

for(k=0;k<n;k++){ 
  for(i=0;i<n;i++)
   for(j=0;j<n;j++)
       if(A[i][j]>(A[i][k]+A[k][j])){
             A[i][j]=A[i][k]+A[k][j];
             path[i][j]=k;
        } 

但是生成的path矩阵却无法正确生成,偶然发现在算法执行之前还需要进行初始化操作,并且核心算法的最后一行并不能写成path[i][j]=k,这里放出完整的c++代码:

#include<stdio.h>

int edge[6][6] = {{0,2,3,999,6,999},
{6,0,999,4,2,8},
{999,6,0,10,999,999},
{2,3,999,0,999,6},
{5,7,8,999,0,999},
{3,999,7,5,999,0}};

int path[6][6] = {-1};

void getPath(int S, int E) 

{  
if (path [S] [E] == -1) {
return; 

else {
printf("%d->",path[S][E]);
getPath(S, path[S][E]);  
}  
}  

int main()

{
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (i != j && edge [i][j] < 999) {
path [i][j] = i;
} else {
path [i][j] = -1;
}
}
}


for(int k=0;k<6;k++){
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
if(edge[i][j]>(edge[i][k]+edge[k][j])){
edge[i][j]=edge[i][k]+edge[k][j];
path[i][j]=path[k][j];
}
}
}
}

getPath(2,5);//从2号节点到5号节点开始寻路并输出经过的所有节点 
printf("5");//需要再将终点进行最后输出 

return 1;

}

原理网上都有,这里给一些急需自制API的小伙伴节省一些时间。

原创粉丝点击