單源最短路徑演算法小結

2021-06-28 23:29:04 字數 1076 閱讀 7097

這裡就不寫具體演算法了,只將他們的時間複雜度、適用範圍、**複雜程度簡單做個比較

待搜尋的圖都指有向圖(無向圖類似)。儲存方式均為鄰接表

一、廣度優先搜尋(bfs)

時間複雜度:o(v+e),效率很高

適用範圍:(很窄)僅適於無權邊的圖。即每條邊長度都為1的情況

**複雜程度:一般,需佇列

二、bellman-ford

時間複雜度:o(ve),效率一般

適用範圍:(很廣)允許存在負權邊,能夠判斷圖中是否存在從源點可到達的負權環路

**複雜程度:較易

三、有向無環圖演算法

時間複雜度:o(v+e),效率很高

適用範圍:(很窄)僅適於有向無環圖

**複雜程度:一般,需拓撲排序

四、dijkstra

適用範圍:(一般)不允許存在負權邊

這個演算法複雜度取決於"取最小"(extract-min)操作使用的演算法

extract-min操作 

時間複雜度 

**複雜程度

順序檢測所有點決定最小值 

o(v^2)  一般

使用binary-heap(優先佇列) 

o((v+e)lgv) 

較複雜使用fibonacci-heap 

o(vlgv+e) 

較複雜五、spfa (shortest path faster algorithm)

時間複雜度:o(ke),k為一較小常量。效率很高

適用範圍:(較廣),允許存在負權邊,但不允許負權環路

**複雜程度:較易,需佇列

這個演算法可算是 bellman-ford 的優化版本,去除冗餘的relax操作,效率有很大提公升

有些奇怪的是這個演算法在《演算法導論》和 wikipedia上竟然都沒有介紹,而只在國內的oi相關**論壇才發現的解釋,大多還不是很全面。從適用範圍和**複雜程度來看絕對是乙個值得推薦的演算法(比熟知的dijkstra 都要好),效率上也不比使用 heap 優化的 dijkstra低,一般來說甚至還要高(還有待更多題目實踐驗證)。即使尋找所有頂點對之間的最短路徑這個演算法也是值得考慮的(對每個頂點執行一次spfa)。

蓬萊山輝夜的部落格

單源最短路徑演算法

簡單介紹 最短路徑演算法是圖演算法中的經典演算法,是用於解決圖中某個頂點到另外乙個頂點所經過路徑的花銷最小 這裡的花銷可能是時間也可能指費用等 dijkstra是用於解決單源最短路徑的經典演算法。圖的儲存方式 鄰接矩陣 在鄰接矩陣中,要獲取某個結點的出度和入讀,是通過掃瞄結點所在臨界矩陣中的行列完成...

單源最短路徑

include define max 999 define maxverts 10 typedef struct graph void chushi graph g void dij graph int key,int int int main for i 1 i g.numverts i dij ...

單源最短路徑

最優子結構 最短路徑的子路徑也是最短路徑,動態規劃和貪心演算法的乙個重要指標。環路 一條最短路徑不可能包含環路 1 環路權重為負,如果有一條環路權重為負,則不存在最短路徑 2 環路權重為零,如果包含該環路,則將該環路去掉即可 3 環路權重為正,去掉改環路可以得到更短的路徑,因此不可能是最短路徑 最短...