[圖論]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點間最短路徑 ②求最小環(可判斷負圈
無向圖:(無負權邊): ①求任意2點間最短路徑 ②求最小環
注意:對於有負權邊的無向圖,會出現很多意想不到的錯誤,請謹慎使用floyd。
2. 個人心得
對於floyd,我認為最重要的是理解k迴圈這層,每列舉一個k,代表下面代表的點對(i,j)之間的 最短路有可能會通過k這點而變小,也就是說在i到j的這條簡單路徑上插上k這個點,有可能會使路徑長度變小。還有就是floyd求出來的最短路徑肯定是簡單路徑(無向圖)
關於可Floyd解的題其頂點數都比較小,根據這點會給我們一點暗示.
如果要輸出floyd所求相關路徑,我們可以記錄
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 //深入理解
4. 個人總結
Floyd演算法有很多其他的應用,需要不斷的積累,但是我相信只要能理解好floyd的DP思想(每個k點插入或者不插入相關路徑),很多問題多能迎刃而解.
附錄:關於Floyd判斷環的可行性
注:該附錄未經嚴格驗證,請讀者認真思考