弗洛伊德算法笔记(path路径的理解)


求一个图中各个点之间的距离,弗洛伊德算法无疑是非常简单的,但是以前只会求每个点之间的dist,(最短距离),不会求最短距离的路径怎么走,没有理解path最后怎么输出

先看算法核心代码

初始化注意:

1.path[i][j] = j

2.dist对角线为零

核心代码:

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

注: 1. i为每次加入的点

        2.如果通过i到k 更近则更新dist与path

       3.path存的是前驱,即由path[j][k] 即由j->k第一个需要经过的点。

    所以在输出时应有如下代码

i->k 路径

int k = path[a1][a2];
if(a1 != a2)
while(1)
{
    cout<<"->"<<de[k];
    if(k == a2)
    break;
    k = path[k][a2];
}
cout<<endl;

依次输出中间的点并不断更新中间的点,当更新点到达k是则到达我们的目的,结束即可。

 

 

下边对弗洛伊德算法进行讨论

其能解决负权边的问题,但是其解决不了负权回路的问题,因为负权回路的图是没有最短路径的,最小是负无穷

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM