Floyd算法

Floyd算法

解決給定加權圖中頂點間最短路徑的算法
Floyd算法(Floyd-Warshall algorithm)又稱為弗洛伊德算法、插點法,是解決給定的加權圖中頂點間的最短路徑的一種算法,可以正确處理有向圖或負權的最短路徑問題,同時也被用于計算有向圖的傳遞閉包。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。[1]
    中文名:弗洛伊德算法 外文名:Floyd 适用領域: 所屬學科: 時間複雜度:O(n^3) 空間複雜度:O(n^2) 命名者:羅伯特·弗洛伊

核心思路

路徑矩陣

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

從圖的帶權鄰接矩陣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,k]+map[k,j],map[i,j]};

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,路徑為{V5,V3,V1},如果D(5,3)=3,說明V5與V3直接相連,如果D(3,1)=1,說明V3與V1直接相連。

優缺點分析

Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路徑),是一種動态規劃算法,稠密圖效果最佳,邊權可正可負。此算法簡單有效,由于三重循環結構緊湊,對于稠密圖,效率要高于執行|V|次Dijkstra算法,也要高于執行V次SPFA算法。

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

缺點:時間複雜度比較高,不适合計算大量數據。

相關詞條

相關搜索

其它詞條