關於對Dijkstra最短路徑演算法理解(無程式碼版)
演算法步驟:
(1)、設定兩個結點集合U、T,將源點v新增到U,其餘所有頂點新增到T;
(2)、從給定點v開始,搜尋其鄰接結點,生成多條初始路徑,並新增到路徑集合Path;
(3)、從Path中計算路徑長度最短的路徑,如果U中不存在該路徑的終點,則說明已經找到v到該結點的最短路徑,新增該結點到U,且T中移除該結點;
(4)、根據(3)中得到的最短路徑及該路徑終點的鄰接結點,若該路徑未經過鄰接結點,則擴充套件生成新的路徑,如果其他路徑已經經過該鄰接結點,則比較新路徑與已有路徑的路徑長度,保留路徑長度最短的路徑,之後刪除該最短路徑;
(5)、回到步驟(3),直到所有結點都新增到U。
以V1節點為開始點V11節點為結束點開始遍歷路徑圖:
在v1點會直接遍歷與其直接相連的路徑,(v1-v2:2)(v1-v3:8)(v1-v4:1),最短路徑為v1-v4,記錄當前短路徑為最短路徑,由最短路徑原理(不存通過其他點到達)得出v1-v4最短路徑為1,T中移除v4並新增到U中ps:此時會照樣把(v1-v2:2)(v1-v3:8)儲存起來。結果如下圖:
重點來了:此時v4能到達v3和v7,記(v1-v4-v3:8)(v1-v4-v7:10),發現此時路徑(v1-v2:2)為最短路徑,於是更新最短路徑為v1-v2(因為Dijkstra演算法即為永遠只走最短的路徑),幸虧通過上一步記錄了(v1-v2:2)(v1-v3:8),雖然上一步並沒有走那兩條路。因為在上一步中,3條路徑中(v1-v4:1)為最短路徑,而現在的
結果如下圖:
此時衍生點為v2,記錄v1-v2-v3:8,記錄v1-v2-v5:3,再從現在的5條衍生路徑中選最短的路徑:
後續結果便不在細說原因了
也由於其特點,不會去更新已經找到最短路徑的點,所以在分析權重存在負值的路徑是不合理的。這種情況下不適用Djksstra演算法。