弗洛伊德演算法

2021-06-22 01:06:17 字數 1730 閱讀 5881

floyd演算法詳解:求解任意兩點間的最短距離

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

弗洛伊德演算法

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

弗洛伊德演算法

floyd warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o n 3 使用條件 範圍 通常可以在任何圖中使用,包括有向圖 帶負權邊的圖。floyd warshall 演算法用來找出每對點之間的最短距離。它需要用鄰接矩陣來儲存邊,這個演算法通過考慮最佳子路徑來...