1. 程式人生 > >關於對Dijkstra最短路徑演算法理解(無程式碼版)

關於對Dijkstra最短路徑演算法理解(無程式碼版)

演算法步驟

1)、設定兩個結點集合UT,將源點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)為最短路徑,而現在的

衍生路徑中有四條(v1-v2:2),(v1-v3:8),(v1-v4-v3:8),(v1-v4-v7),而在這四條路徑中(v1-v2:2)為最短路徑,根據Djkstra演算法就走了上一步儲存的v1-v2 PS:這一步的衍生點為V4,會·先記錄v1-v4-v3,v1-v4-v7,同時記錄他們的權重值。不管最終走不走這新的衍生路,都要記錄下來

     結果如下圖:


此時衍生點為v2,記錄v1-v2-v3:8,記錄v1-v2-v5:3,再從現在的5條衍生路徑中選最短的路徑:


後續結果便不在細說原因了







也由於其特點,不會去更新已經找到最短路徑的點,所以在分析權重存在負值的路徑是不合理的。這種情況下不適用Djksstra演算法。