這裡就不寫具體演算法了,只將他們的時間複雜度、適用範圍、**複雜程度簡單做個比較
待搜尋的圖都指有向圖(無向圖類似)。儲存方式均為鄰接表
一、廣度優先搜尋(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 環路權重為正,去掉改環路可以得到更短的路徑,因此不可能是最短路徑 最短...