Floyd算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法
在計算機科學中,Floyd-Warshall算法是一種在具有正或負邊緣權重(但沒有負周期)的加權圖中找到最短路徑的算法。算法的單個執行將找到所有頂點對之間的最短路徑的長度(加權)。 雖然它不返迴路徑本身的細節,但是可以通過對算法的簡單修改來重建路徑。 該算法的版本也可用於查找關係R的傳遞閉包,或(與Schulze投票系統相關)在加權圖中所有頂點對之間的最寬路徑。
Floyd-Warshall算法是動態規劃的一個例子,並在1962年由Robert Floyd以其當前公認的形式出版。然而,它基本上與Bernard Roy在1959年先前發表的算法和1962年的Stephen Warshall中找到圖形的傳遞閉包基本相同,並且與Kleene的算法密切相關 在1956年)用於將確定性有限自動機轉換為正則表達式。算法作為三個嵌套for循環的現代公式首先由Peter Ingerman在1962年描述。
該算法也稱為Floyd算法,Roy-Warshall算法,Roy-Floyd算法或WFI算法。
優缺點:
Floyd算法適用於APSP(AllPairsShortestPaths),是一種動態規划算法,稠密圖效果最佳,邊權可正可負。此算法簡單有效,由於三重循環結構緊湊,對於稠密圖,效率要高於執行|V|次Dijkstra算法。
優點:容易理解,可以算出任意兩個節點之間的最短距離,代碼編寫簡單
缺點:時間複雜度比較高,不適合計算大量數據。
時間複雜度:O(n^3);空間複雜度:O(n^2);
任意節點i到j的最短路徑兩種可能:
直接從i到j;
從i經過若干個節點k到j。
map(i,j)表示節點i到j最短路徑的距離,對於每一個節點k,檢查map(i,k)+map(k,j)小於map(i,j),如果成立,map(i,j) = map(i,k)+map(k,j);遍歷每個k,每次更新的是除第k行和第k列的數。
Floyd 第一迭代
Floyd 第二迭代
Floyd 第三迭代
大家試試能不能做出來下面的這道題: