1. 程式人生 > >[圖論]Floyd 演算法小結

[圖論]Floyd 演算法小結

Floyd 演算法小結

By Wine93 2013.11

1.Floyd演算法簡介

Floyd演算法利用動態規劃思想可以求出任意2點間的最短路徑,時間複雜度為O(n^3),對於稠密圖效率要高於執行|V|Dijkstra演算法.

核心程式碼如下:

for(k=1;k<=n;k++)

     for(i=1;i<=n;i++)

         for(j=1;j<=n;j++)

             dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

相關應用 有向圖: ①求任意2點間最短路徑  ②求最小環(可判斷負圈

,檢查dis[i][i])   ③求傳遞閉包

                無向圖:(無負權邊): ①求任意2點間最短路徑  ②求最小環

注意:對於有負權邊的無向圖,會出現很多意想不到的錯誤,請謹慎使用floyd

2. 個人心得

對於floyd,我認為最重要的是理解k迴圈這層,每列舉一個k,代表下面代表的點對(ij)之間的 最短路有可能會通過k這點而變小,也就是說在ij的這條簡單路徑上插上k這個點,有可能會使路徑長度變小。還有就是floyd求出來的最短路徑肯定是簡單路徑(無向圖)

關於可Floyd解的題其頂點數都比較小,根據這點會給我們一點暗示.

如果要輸出floyd所求相關路徑,我們可以記錄

mid[i][j](表示ij這條路徑中插入的點k),這樣通過不斷遞迴,就可以求出整條路徑

3. Floyd演算法的應用舉例

(1) 求無向圖最小環 

HDU 1599 find the mincost route      POJ 1734 Sightseeing trip(需輸出最小環)  

相關證明理解請參考下面部落格,講解的非常好:

(2)判斷有向圖是否有正環

POJ 2240 Arbitrage

(3)傳遞閉包

 POJ 3660 Cow Contest

(4)好題推薦(獨立完成)

HDU 3631 Shortest Path    //深入理解floyd

HDU 4034 Graph               //深入理解

floyd ,思維鍛鍊

4. 個人總結

Floyd演算法有很多其他的應用,需要不斷的積累,但是我相信只要能理解好floydDP思想(每個k點插入或者不插入相關路徑),很多問題多能迎刃而解.

附錄:關於Floyd判斷環的可行性


注:該附錄未經嚴格驗證,請讀者認真思考