1. 程式人生 > >求最短路演算法的一個總結

求最短路演算法的一個總結

無環情形
無向無權圖: BFS
有向圖:不管是否有權,都可以用DAG DP
DAG的拓撲排序(Topological Sorting):可藉助DFS(或Kahn演算法)完成。如果排序失敗,說明該圖存在有向環,不是DAG。
什麼叫拓撲排序呢?它是有向無環圖(DAG, Directed Acyclic Graph)的所有頂點的線性序列。且該序列必須滿足下面兩個條件:
1) 每個頂點出現且只出現一次。
2) 若存在一條從頂點 A 到頂點 B 的路徑,那麼在序列中頂點 A 出現在頂點 B 的前面。
有向無環圖(DAG)才有拓撲排序,非DAG圖沒有拓撲排序一說。一個有向圖能夠被拓撲排序的充要條件是它是一個有向無環圖(DAG)。

有環情形
有向正權圖:
Dijkstra: 求單源、無負權的最短路(也可以用於無向正權,因為無向可以化為雙有向) 。時效性較好,時間複雜度為O(V*V+E)。源點可達的話,O(V*lgV+E*lgV)=>O(E*lgV)。當是稀疏圖的情況時,此時E=V*V/lgV,所以演算法的時間複雜度可為O(V^2) 。若是斐波那契堆作優先佇列的話,演算法時間複雜度,則為O(V*lgV + E)。

有向負權圖:
Bellman-Ford: 單點最短路,可檢測並輸出負環。時間複雜度O(VE)。
SPFA:Bellman-Ford演算法的佇列優化版,可檢測負環(當存在一個點入隊大於等於V次,則有負環),但不能輸出負環。
時間複雜度:最好情形下,每一個節點都只入隊一次,則演算法實際上變為廣度優先遍歷,其時間複雜度僅為O(E)。某些特殊情形下 , 會使得每一個節點都被入隊(V-1)次,此時演算法退化為Bellman-ford演算法,其時間複雜度為O(VE)。
Floyd-Warshall

:任意兩點間最短路徑,基於DP。可以正確處理有向圖或負權的最短路徑問題。時間複雜度為O(V^3),空間複雜度為O(V^2)。