最短路徑Floyd算法(C語言)

定義
  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號頂點到j號頂點的最短路徑長度,稱D(n)爲圖的距離矩陣,同時還可引入一個後繼節點矩陣path來記錄兩點間的最短路徑。
  採用的是鬆弛技術,對在i和j之間的所有其他點進行一次鬆弛。所以時間複雜度爲O(n^3);
 算法描述
  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即爲所有點對的最短路徑矩陣
 算法過程
  把圖用鄰接矩陣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直接相連。
 時間複雜度
  O(n^3)
 優缺點分析
  Floyd算法適用於APSP(All Pairs Shortest Paths),是一種動態規劃算法,稠密圖效果最佳,邊權可正可負。此算法簡單有效,由於三重循環結構緊湊,對於稠密圖,效率要高於執行|V|次Dijkstra算法。
  優點:容易理解,可以算出任意兩個節點之間的最短距離,代碼編寫簡單;
  缺點:時間複雜度比較高,不適合計算大量數據。

 

發佈了33 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章