Floyd Warshall演算法DP流程詳解

2021-04-28 01:18:35 字數 1696 閱讀 7942

floyd-warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o(n^3)。我們平時所見的floyd演算法的一般形式如下:

1void

floyd()

注意下第6行這個地方,如果dist[i][k]或者dist[k][j]不存在,程式中用乙個很大的數代替。最好寫成if(dist[i][k]!=inf && dist[k][j]!=inf &&dist[i][k]+dist[k][j],則c[i, j, 0] =邊的長度;若i= j ,則c[i,j,0]=0;如果g中不包含邊,則c (i, j, 0)= +∞。c[i, j, n] 則是從i 到j 的最短路徑的長度。

對於任意的k>0,通過分析可以得到:中間頂點不超過k 的i 到j的最短路徑有兩種可能:該路徑含或不含中間頂點k。若不含,則該路徑長度應為c[i, j, k-1],否則長度為 c[i, k, k-1] +c[k, j, k-1]。c[i, j, k]可取兩者中的最小值。

狀態轉移方程:c[i, j, k]=min,k>0。

這樣,問題便具有了最優子結構性質,可以用動態規劃方法來求解。

為了進一步理解,觀察上面這個有向圖:若k=0, 1, 2, 3,則c[1,3,k]= +∞;c[1,3,4]= 28;若k = 5, 6,7,則c [1,3,k] = 10;若k=8, 9, 10,則c[1,3,k] = 9。因此1到3的最短路徑長度為9。

下面通過程式來分析這一dp過程,對應上面給出的有向圖:

1#include 

<

iostream

>

2using

namespace

std;34

const

intinf 

=100000;5

intn=10

,map[

11][

11],dist[

11][

11][

11];

6void

init()

17void

floyd_dp()29}

30int

main()39}

40return0;

41}輸入 1 3

輸出 +∞

+∞+∞

+∞28

1010109

99floyd-warshall演算法不僅能求出任意2點間的最短路徑,還可以儲存最短路徑上經過的節點。下面用精簡版的floyd演算法實現這一過程,程式中的圖依然對應上面的有向圖。

1#include 

<

iostream

>

2using

namespace

std;34

const

intinf 

=100000;5

intn=10

,path[

11][

11],dist[

11][

11],map[

11][

11];

6void

init()

17void

floyd()

28void

output(

inti,

intj)35}

36int

main()47}

48return0;

49}輸入 1 3                    

輸出 1 2 5 8 6 3

演算法儲備之Floyd Warshall演算法

floyd warshall演算法是動態規劃的經典演算法 該演算法可以解決圖中每個頂點到其他頂點的距離,圖中可以有負權值邊,但不能有負迴圈。時間複雜度為o v的三次方 演算法思想 dist v v 初始化為二維陣列edge v v 的內容 for迴圈執行v次,每次以乙個頂點為中間頂點,更新所有頂點通...

floyd warshall演算法 學習中

今天做題時接觸到了這個演算法 單獨一條邊的路徑也不一定是最佳路徑。從任意一條單邊路徑開始。所有兩點之間的距離是邊的權的和,如果兩點之間沒有邊相連,則為無窮大 對於每一對頂點 u 和 v,看看是否存在乙個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。不可思議的是,只要按排適當...

Floyd Warshall 多源最短路演算法

我們之前介紹過dij kstr adijkstra dijkst ra和b el lman for d sp fabellman ford spfa bellma n fo rd s pfa演算法,這些演算法解決的都是單源最短路的問題,那麼有沒有乙個演算法,可以計算出任意兩點之間的最短路呢?答案是 ...