最短路徑問題(Dijkstra算法)學習心得

一、前言

在離散數學的學習過程中,遇到了最短路徑問題。Dijkstra算法求解單源最短路徑本身不易理解,本文綜合自己的理解試圖給出Dijkstra算法形式化描述以及示例。

二、相關概念

最短路徑問題:給定帶權圖G=<V,E,W>及節點u和v,其中每一條邊e的權重W(e)爲非負數,求從u到v的最短路徑。

最短路徑性質:如果 uv_{i1}v_{i2}\cdot\cdot\cdot v_{ik}v是從u到v的最短路徑,則對每一個 t\left(1\leq t\leq k\right)uv_{i1}v_{i2}\cdot\cdot\cdot v_{ik}v是 uv_{i1}v_{i2}\cdot\cdot\cdot v_{it}的最短路徑。(用土話講就是,最短路徑上的任意兩點之間的路徑也是最短的)

三、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所示,求從v_1到其餘各頂點的最短路徑和距離。

                                                    圖1-1                              

使用dist數組表示各頂點到v1頂點的路徑長度,則初始時dist=[0, 3, 7, 5, +\infty,+\infty,+\infty]

使用S表示已選節點,T表示未選節點,則初始時S={v_1},T={v_2,v_3,v_4,v_5,v_6,v_7}

第一步,在T集合中挑選出與源點距離最短的頂點v2,並修改dist中以v2爲中間點後各頂點的最短距離。則

S= {v1,v2} T={v3,v4,v5,v6,v7} 

dist=[0,3,5,5,9,+\infty,+\infty]

第二步,在T中挑選出與源點距離最短的頂點v3,並修改dist中以v3爲中間點後各頂點的最短距離。則

S={v1,v2,v3} T= {v4, v5, v6, v7}

dist = [0, 3, 5, 5, 8, +\infty+\infty]

第三步,在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算法

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章