最短路徑 迪傑斯特拉 Dijkdtra 演算法

2022-10-08 20:54:11 字數 1722 閱讀 2034

最短路徑--迪傑斯特拉(dijkdtra)演算法

迪傑斯特拉(dijkstra)演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。

它的主要特點是以起始點為中心向外層層擴充套件(廣度優先搜尋思想),直到擴充套件到終點為止。

演算法思想

每次找到離源點最近的乙個頂點,然後以該頂點為中心,然後得到源點到其他頂點的最短路徑。貪心演算法。

以鄰接矩陣為儲存圖

注:圖中,鄰接矩陣的對稱線也是無窮大,在初始時預設為無窮大。

(1) 用dis陣列來儲存源點1到其他頂點的初始路徑,標記1號頂點,此時dis陣列中的值稱為最短路徑的估計值。

(2) 從dis陣列中找出離源起點最近的點2號,以2號頂點為源點進行找最近的頂點。把2號頂點標記,表示已經有最小值。以2號頂點為源點,看2號頂點有哪些出邊,看能不能優化,再短一些2->3:9,2->4:3而dis中最短路徑的估計值,1->2:1, 1->3:12那麼結合一下 1->2->3:1+9=10,比1->3:12 小,1->2:1 和 2->4:3,那麼1->2->4:4所以要更新 dis中的最短路徑估計值,

(3) 此時1號和2號頂點已經標記,表示已經最小值,現在在3號和4號找,4號頂點距離源點最近,所以以4號頂點進行找,標記4號頂點4號的出邊:4->3:4,4->5:13,4->6:15。用剛才的方法進行更新估計值。1->3:10 比 1->4->3:4+4=8,大,所以更新1->4:4,4->5:13+4=17,更新。1->4:4,4->6:15+4 = 19。更新

(4)從3號,5號,6號,找最短路徑8,標記3號頂點。以相同的方法進行更新。

(5)從5號和6號頂點查詢,標記5號。以相同的方法進行更新。

(6)此時剩餘6號頂點,6號的出邊沒有,此時所有的頂點都以遍歷完,dis中的值就是最終的結果。

步驟:

(1)將所有的頂點分為兩個部分,已知最短路徑的頂點集合p和未知的頂點集合q,初始時,p中只有乙個源頂點1號。這裡用book陣列來標記頂點是否在p中,1表示在p中,0表示在q中。dis陣列來記錄最短路徑,陣列下標來表示頂點的下標。設定源點1到到其他頂點的路徑值,放置到dis中。

(2)在dis中找到源點s到其他頂點的最短路徑u頂點,將其加入p集合,並考察以x頂點為起點的出邊,然後對dis 進行更新。即:如果存在一條從u到v的邊,那麼可以拓展一條從s到u再到v的邊,路徑長度為dis[u]+edge[u] [v] ,如果這個值比目前的值dis[v]小,那麼就進行更新。

(3)重複第2步,直到q為空,即book都被標記,此時dis陣列中就是源點到各個頂點的最短路徑。

練習題

p1359 租用遊艇

p3371【模板】單源最短路徑(弱化版)

p4779【模板】單源最短路徑(標準版)

cf910a the way to home

p1576 最小花費

迪傑斯特拉最短路徑

問題描述 在帶權有向圖g中,給定乙個源點v,求從v到g中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的次序產生最短路徑的演算法。在本題中,讀入乙個有向圖的帶權鄰接矩陣 即陣列表示 建立有向圖並按照以上描...

最短路 (迪傑斯特拉)

a 最短路 crawling in process.crawling failed time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 2544 description 在...

最短路徑 迪傑斯特拉演算法

例如,要求下圖v0到v8的最短路徑 所以我們可以找到這樣的一條最短路徑 下面是他的鄰接矩陣 偽 如下 define maxvex 9 define infinity 65535 typedef int patharc maxvex 用於儲存最短路徑下標的陣列 typedef int shortpat...