Floyd演算法(求最短路)

2022-04-28 16:48:12 字數 1577 閱讀 8805

百科名片

弗洛伊德演算法

floyd演算法又稱為弗洛伊德演算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。

通過乙個圖的權值矩陣求出它的每兩點間的最短路徑

矩陣。從圖的帶權鄰接矩陣a=[a(i,j)] n×n開始,遞迴地進行n次更新,即由矩陣d(0)=a,按乙個公式,構造出矩陣d(1);又用同樣地公式由d(1)構造出d(2);……;最後又用同樣的公式由d(n-1)構造出矩陣d(n)。矩陣d(n)的i行j列元素便是i號頂點到j號頂點的最短路徑長度,稱d(n)為圖的距離矩陣,同時還可引入乙個後繼節點矩陣path來記錄兩點間的最短路徑。

採用的是(鬆弛技術),對在i和j之間的所有其他點進行一次鬆弛。所以時間複雜度為o(n^3);

其狀態轉移方程如下: map[i,j]:=min

map[i,j]表示i到j的最短距離

k是窮舉i,j的斷點

map[n,n]初值應該為0,或者按照題目意思來做。

當然,如果這條路沒有通的話,還必須特殊處理,比如沒有map[i,k]這條路

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

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

===把圖用鄰接距陣g表示出來,如果從vi到vj有路可達,則g[i,j]=d,d表示該路的長度;否則g[i,j]=無窮大。

定義乙個距陣d用來記錄所插入點的資訊,d[i,j]表示從vi到vj需要經過的點,初始化d[i,j]=j。

把各個頂點插入圖中,比較插點後的距離與原來的距離,g[i,j] = min( g[i,j], g[i,k]+g[k,j] ),如果g[i,j]的值變小,則d[i,j]=k。

在g中包含有兩點之間最短道路的資訊,而在d中則包含了最短通路徑的資訊。

比如,要尋找從v5到v1的路徑。根據d,假如d(5,1)=3則說明從v5到v1經過v3,路徑為,如果d(5,3)=3,說明v5與v3直接相連,如果d(3,1)=1,說明v3與v1直接相連。

o(n^3)

floyd演算法適用於apsp(all pairs shortest paths),是一種動態規劃演算法,稠密圖效果最佳,邊權可正可負。此演算法簡單有效,由於三重迴圈結構緊湊,對於稠密圖,效率要高於執行|v|次dijkstra演算法。

優點:容易理解,可以算出任意兩個節點之間的最短距離,**編寫簡單

缺點:時間複雜度比較高,不適合計算大量資料。

floyd演算法又稱為弗洛伊德演算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。

a) 初始化:d[u,v]=a[u,v]

b) for k:=1 to n

for i:=1 to n

for j:=1 to n

if d[i,j]>d[i,k]+d[k,j] then

d[i,j]:=d[i,k]+d[k,j];

c) 演算法結束:d即為所有點對的最短路徑矩陣

Floyd求最短路

傳送門 題意 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出 impossible 資料保證圖中不存在負權迴路。輸入格式 第一行包含三個整數n,m,k 接下來m行,每行包含三個整...

Floyd求最短路

路徑矩陣 通過乙個圖的權值矩陣求出它的每兩點間的最短路徑矩陣。從圖的帶權鄰接矩陣a a i,j n n開始,遞迴地進行n次更新,即由矩陣d 0 a,按乙個公式,構造出矩陣d 1 又用同樣地公式由d 1 構造出d 2 最後又用同樣的公式由d n 1 構造出矩陣d n 矩陣d n 的i行j列元素便是i號...

AcWing Floyd求最短路 Floyd

時 空限制 1s 64mb 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出 impossible 資料保證圖中不存在負權迴路。第一行包含三個整數n,m,k 接下來m行,每行包含三...