迪傑斯特拉(Dijkstra)算法是求解「圖」中單源最短路徑的算法之一,所謂單源最短路徑是指給定一個「初始節點」,求解其到其它各頂點的最短路徑。git
爲了方便描述,假設圖中全部邊的權重都不爲負:算法
該圖已經較簡潔,而且方便對該算法進行描述:blog
假設1號節點爲指定的開始節點,現欲求1號節點到二、三、4號各節點的最短路徑。其中1號到2號節點的求解過程以下:get
(1)因爲1號節點與二、三、4號節點直接相連的路徑分別爲w六、w五、w1(咱們將這幾個路徑放到一個臨時的集合中,並試圖從中選擇一個到其它節點中路徑最短的那個)。it
(2)若是臨時集合中w6爲其中的最短路徑,則w6爲最終結果,關鍵問題是w1 -> w4,w1 -> w3 -> w2,w5 -> w2,w5 -> w3 -> w4也是其他的4條路徑。因此咱們假設(1)中w1爲與1號節點直連路徑中最短的那條(所以w1爲1號節點和4號節點的最短路徑,咱們將4號節點放入到最終的最短路徑集合中)。im
(3)對於4號節點,除了直連的1號節點外,還有其他的2號節點和3號節點。若是w1 -> w4的路徑和小於w6,那麼臨時集合中1號與2號節點的最短路徑需更新爲w1+w4(假設更新)。同理w1 -> w3的路徑和小於w5,則臨時集合中1號與3號節點的最短路徑需更新爲w1+w3(假設更新,注意咱們的目標是求1號到2號節點的最短路徑,可是該算法會附帶着求解到其它節點的最短路徑)。img
(4)目前爲止在臨時集合中保存着1號節點分別到2號節點和3號節點的最短路徑,現按照(2)的步驟從其中選擇一條最短路徑來,若是選擇2號節點則爲最終結果,若是選擇3號節點則須要按照(3)的步驟進一步判斷若是w1 -> w3 -> w2的路徑和小於w1 -> w4則最終的最短路徑更新爲w1+w3+w2。集合
注意:以上就是該算法的全過程,並且前提條件是權重不爲負。那麼假設權重可能爲負則該算法的第(1)步就不能實現,由於一開始就不能選擇一個到其它節點中路徑最短的那個節點,這是前提條件。固然該算法在真正實現的時候還須要考慮一下權重相等的狀況,具體代碼請參考我給出的開源實現:https://gitee.com/fat_mt/graph。co