弗洛伊德算法筆記(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