C++迪傑斯特拉演算法求最短路徑的詳細解釋

無火的殘燼發表於2020-12-08
  1. 演算法解釋:
    將各項頂點與v0間最短路徑長度遞增的次序,逐個將集合中V-S中的頂點加入到集合S中去,在這個過程中,總保持從V0到集合S中各頂點的路徑長度始終不大於集合V-S中各頂點的路徑長度

  2. 演算法實現
    這個書上都會有,百度也行,本文章主要重點在於理解

  3. 通過例題詳解
    如圖:C語言資料結構例題

表格:最短路徑的求解(粗體表示最短路徑)

  1. 首先看圖可知,a到c的路徑最短為2,而其他的都較大或者為無窮,所以此時終點集為{a,c},即為當前最短路徑,所以c這一行後續將不在考慮,全部為空。
i=1i=2i=3i=4i=5i=6
b15 (a,b)
c2 (a,c)
d12 (a,d)
e
f
g
S(終點集){a,c}
  1. 因為c已經在最短路徑裡,下一步將c加入到其他路徑中,例如一開始a不能到e現在通過c可以到e,其他同理,而其他加了反而到不了的就可以忽視,繼續選擇原本的路徑或者∞,表格為:
i=1i=2i=3i=4i=5i=6
b15 (a,b)15 (a,b)
c2 (a,c)
d12 (a,d)12 (a,d)
e10(a,c,e)
f6(a,c,f)
g
S(終點集){a,c}{a,c,f}
  1. 其後同理,在i=3中,因為f無法帶入(a,c,e)中,所以這一行不變,在d這一行,發現帶入可以帶入c,f組成路徑,即為(a,c,f,d),表格為:
i=1i=2i=3i=4i=5i=6
b15 (a,b)15 (a,b)15 (a,b)15 (a,b)
c2 (a,c)
d12 (a,d)12 (a,d)11(a,c,f,d)11(a,c,f,d)
e10(a,c,e)10(a,c,e)
f6(a,c,f)
g16(a,c,f,g)16(a,c,f,g)
S(終點集){a,c}{a,c,f}{a,c,f,e}{a,c,f,e,d}

4.在i=5時,由於c,d,e,f皆找到最短路徑,所以最後的路徑一定在b或者g中,而此時b依然無法帶入其他點,在g點可以組成權值為14的路徑(a,c,f,d,g),最後終於到達b,得出最短路徑,表格為:

i=1i=2i=3i=4i=5i=6
b15 (a,b)15 (a,b)15 (a,b)15 (a,b)15 (a,b)15 (a,b)
c2 (a,c)
d12 (a,d)12 (a,d)11(a,c,f,d)11(a,c,f,d)
e10(a,c,e)10(a,c,e)
f6(a,c,f)
g16(a,c,f,g)16(a,c,f,g)14(a,c,f,d,g)
S(終點集){a,c}{a,c,f}{a,c,f,e}{a,c,f,e,d}{a,c,f,e,d,g}{a,c,f,e,d,g,b}

相關文章