Floyd演算法思想

2021-07-10 15:12:48 字數 1337 閱讀 5325

本來**量如此小的演算法不用出模板了,但是的確思想還是很好的。

1.定義概覽

floyd-warshall演算法(floyd-warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd-warshall演算法的時間複雜度為o(n3),空間複雜度為o(n2)。

2.演算法描述

1)演算法思想原理:

floyd演算法是乙個經典的動態規劃演算法。用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋(這個詮釋正是動態規劃最富創造力的精華所在)

從任意節點i到任意節點j的最短路徑不外乎2種可能,1是直接從i到j,2是從i經過若干個節點k到j。所以,我們假設dis(i,j)為節點u到節點v的最短路徑的距離,對於每乙個節點k,我們檢查dis(i,k) + dis(k,j) < dis(i,j)是否成立,如果成立,證明從i到k再到j的路徑比i直接到j的路徑短,我們便設定dis(i,j) = dis(i,k) + dis(k,j),這樣一來,當我們遍歷完所有節點k,dis(i,j)中記錄的便是i到j的最短路徑的距離。

2).演算法描述:

a.從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。   

b.對於每一對頂點 u 和 v,看看是否存在乙個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。

3).floyd演算法過程矩陣的計算----十字交叉法

方法:兩條線,從左上角開始計算一直到右下角 如下所示

給出矩陣,其中矩陣a是鄰接矩陣,而矩陣path記錄u,v兩點之間最短路徑所必須經過的點

相應計算方法如下:

最後a3即為所求結果

3.演算法**實現

typedef struct

mgraph;

void

floyd(mgraph g)

for(k=0;k)

} }

演算法時間複雜度:o(n3)

Floyd演算法思想

floyd演算法是乙個經典的動態規劃演算法。用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋 這個詮釋正是動態規劃最富創造力的精華所在 floyd演算法加入了這個概念 ak i,j 表示從i到j中途不經過索引比k大的點的最短...

Floyd演算法簡介

演算法定義 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n 3 空間複雜度為o n2 演算法...

Floyd演算法 模板

floyd演算法又稱為插點法,是一種用於尋找給定的加權圖中多源點之間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名。注意 其實很多題目不是直接問你 floyd 怎麼求最短路徑,而是要你利用 floyd 的動態規劃思想解決類似 floy...