弗洛伊德演算法 路徑還原

2021-07-11 19:55:19 字數 580 閱讀 1141

用dp來解決,在只使用頂點0~k和i,j的情況下(i,j作為起點和重點,0~k個點作為中間點),記i到j的最短長度為dp[k][i][j],k=-1表示只是用i和j兩個點,此時dp[0][i][j]=cost[i][j]

接下來,我們分i到j的最短路恰好經過k和不經過k兩種,如果不經過k點

那麼就是dp[k-1][i][j],如果經過k點,就是dp[k-1][i][k]+dp[k-1][k][j]

所以dp[k][i][j]=min

這個dp可以使用同乙個陣列,前面的k只要放在外層迴圈就行了。

所以

for i=0->v

for j=0->v

for l=0->v;

dp[i][j]=min

可以求出負環,只要某個頂點dis[i][j]為負說明有負環。

注意這個迴圈一定要k在外層,因為k說明了中間點的個數,中間點一定要從少到多推過去

對於路徑還原,由於dijkstrea,spfa,floyd演算法都是一種動態接近的思想,所以在每次狀態轉移的時候進行記錄就可以了,維護乙個pre陣列就可以完成這個工作

弗洛伊德演算法

弗洛伊德演算法 floyd 又稱為是插點法。目的是求加權圖中頂點中最短路徑的方法。本文通過舉例子的方法想你具體解釋何為弗洛伊德演算法。有乙個送禮物的問題,是csdn上的乙個題目,題目的詳情是這樣的。hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外...

弗洛伊德演算法

floyd演算法詳解 求解任意兩點間的最短距離 floyd warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o n 3 我們平時所見的floyd演算法的一般形式如下 1void floyd 注意下第6行這個地方,如果dist i k 或者dist k j 不存...

弗洛伊德演算法

弗洛伊德演算法 求任意一點i到任意一點j的最短路。分析 求i到j的最短路,大可以使用群舉法,因為點都是離散的,i到j的路徑是有限的,所以一定可以通過群舉法得到最短路,但群舉法卻沒太大意義,他的意義在於 把群舉法 通過修改 進行分類,得到好的演算法。flod演算法的分類標準是 通過i到j過點的情況進行...