一、前言
在離散數學的學習過程中,遇到了最短路徑問題。Dijkstra算法求解單源最短路徑本身不易理解,本文綜合自己的理解試圖給出Dijkstra算法形式化描述以及示例。
二、相關概念
最短路徑問題:給定帶權圖G=<V,E,W>及節點u和v,其中每一條邊e的權重W(e)爲非負數,求從u到v的最短路徑。
最短路徑性質:如果 是從u到v的最短路徑,則對每一個 , 是 的最短路徑。(用土話講就是,最短路徑上的任意兩點之間的路徑也是最短的)
三、Dijkstra算法描述
算法步驟:
a.初始時,S只包含源點,即S={v},v的距離爲0。U包含除v外的其他頂點,即:U={其餘頂點},若v與U中頂點u有邊,則<u,v>正常有權值,若u不是v的出邊鄰接點,則<u,v>權值爲∞。
b.從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。
c.以k爲新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。
d.重複步驟b和c直到所有頂點都包含在S中
四、示例
帶權圖G如圖1-1所示,求從到其餘各頂點的最短路徑和距離。
圖1-1
使用dist數組表示各頂點到v1頂點的路徑長度,則初始時dist=[0, 3, 7, 5, ,,]
使用S表示已選節點,T表示未選節點,則初始時S={},T={}
第一步,在T集合中挑選出與源點距離最短的頂點v2,並修改dist中以v2爲中間點後各頂點的最短距離。則
S= {v1,v2} T={v3,v4,v5,v6,v7}
dist=[0,3,5,5,9,,]
第二步,在T中挑選出與源點距離最短的頂點v3,並修改dist中以v3爲中間點後各頂點的最短距離。則
S={v1,v2,v3} T= {v4, v5, v6, v7}
dist = [0, 3, 5, 5, 8, , ]
第三步,在T中挑選出與源點距離最短的頂點v4, 並修改dist中以v4爲中間點後各頂點的最短距離。則
S={v1,v2,v3,v4}, T= {v5, v6, v7}
dist = [0, 3, 5, 5, 8, 7, 13]
第四步,在T中挑選與源點距離最短的頂點v5, 並修改dist中以v5爲中間點後各頂點的最短距離。則
S={v1, v2, v3, v4, v5}, T= {v6, v7}
dist=[0, 3, 5, 5, 8, 7, 10]
第五步,在T中挑選出與源點距離最短的頂點v6, 並修改dist中以v6爲中間點後各頂點的最短距離。則
S= {v1, v2, v3, v4, v5, v6}, T= {v7}
dist=[0, 3, 5, 5, 8, 7, 9]
第六步,在T中挑選出與源點距離最短的頂點v7, 並修改dist中以v7爲中間點後各頂點的最短距離。則
S= {v1, v2, v3, v4, v5, v6, v7}, T= {}
dist=[0, 3, 5, 5, 8, 7, 9]
此時,由於T集合爲空,整個算法到此結束。
五、Java版Dijkstra算法
略