在離散數學的學習過程中,遇到了最短路徑問題。dijkstra演算法求解單源最短路徑本身不易理解,本文綜合自己的理解試圖給出dijkstra演算法形式化描述以及示例。
最短路徑問題:給定帶權圖g=及節點u和v,其中每一條邊e的權重w(e)為非負數,求從u到v的最短路徑。
最短路徑性質:如果
演算法步驟:
a.初始時,s只包含源點,即s=,v的距離為0。u包含除v外的其他頂點,即:u=,若v與u中頂點u有邊,則正常有權值,若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= t=
dist=[0,3,5,5,9,
第二步,在t中挑選出與源點距離最短的頂點v3,並修改dist中以v3為中間點後各頂點的最短距離。則
s= t=
dist = [0, 3, 5, 5, 8,
第三步,在t中挑選出與源點距離最短的頂點v4, 並修改dist中以v4為中間點後各頂點的最短距離。則
s=, t=
dist = [0, 3, 5, 5, 8, 7, 13]
第四步,在t中挑選與源點距離最短的頂點v5, 並修改dist中以v5為中間點後各頂點的最短距離。則
s=, t=
dist=[0, 3, 5, 5, 8, 7, 10]
第五步,在t中挑選出與源點距離最短的頂點v6, 並修改dist中以v6為中間點後各頂點的最短距離。則
s= , t=
dist=[0, 3, 5, 5, 8, 7, 9]
第六步,在t中挑選出與源點距離最短的頂點v7, 並修改dist中以v7為中間點後各頂點的最短距離。則
s= , t= {}
dist=[0, 3, 5, 5, 8, 7, 9]
此時,由於t集合為空,整個演算法到此結束。
略
最短路徑問題(Dijkstra)
一 基本概念 從起點出發找一條到達目的地的 邊權和最小的路徑,這就是單元最短路問題。在最短路問題中,給出的是乙個有向加權圖g v,e 邊的權值是某種物理物件的度量標準,不一定是距離,它可以是時間,金錢,罰款,損失或任何其他路徑線性積累的數量形式。路徑p v0,v1,vk 的權是指其組成邊的所有權值之...
最短路徑問題 dijkstra
description 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 輸入檔案short.in,共有n m...
最短路徑問題(Dijkstra)
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。input 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,...