圖論之最短路徑floyd算法

Floyd算法是圖論中經典的多源最短路徑算法,即求任意兩點之間的最短路徑。 html

它可採用動態規劃思想,由於它知足最優子結構性質,即最短路徑序列的子序列也是最短路徑。算法

 

 

舉例說明最優子結構性質,上圖中1號到5號的最短路徑序列<1,2,4,5>,其子序列<1,2,4>也是最短路徑。htm

在動態規劃算法中,處於首要位置、且也是核心理念之一的就是狀態的定義。blog

動態轉移的基本思想能夠認爲是創建起某一狀態和以前狀態的一種轉移表示。方法

d[k][i][j]定義爲「只能使用第1號到第k號點做爲中間媒介時,點i到點j之間的最短路徑長度」。im

按照前面的定義,d[k][i][j]是一種使用1號到k號點的狀態,能夠想辦法把這個狀態經過動態轉移,規約到使用1號到(k-1)號的狀態,即d[k-1][i][j]。d3

對於d[k][i][j](即便用1號到k號點中的全部點做爲中間媒介時,i和j之間的最短路徑),能夠分爲兩種狀況:img

(I)i到j的最短路不通過k;動態規劃

(II)i到j的最短路通過了k。co

不通過點k的最短路狀況下,d[k][i][j]=d[k-1][i][j]。

通過點k的最短路狀況下,d[k][i][j]=d[k-1][i][k]+d[k-1][k][j]。

所以,綜合上述兩種狀況,即可以獲得Floyd算法的動態轉移方程:

d[k][i][j] = min(d[k-1][i][j], d[k-1][i][k]+d[k-1][k][j])(k,i,j∈[1,n])

在這裏,須要注意上述動態轉移方程的初始(邊界)條件,即d[0][i][j]=w(i, j),

也就是說在不使用任何點的狀況下(「鬆弛操做」的最初),兩點之間最短路徑的長度就是兩點之間邊的權值。

方法:「鬆弛」點,「五行代碼」經過n-1次鬆弛節點

參考資料:https://www.cnblogs.com/chenying99/p/3932877.html

相關文章
相關標籤/搜索