最短路徑 Dijkstra演算法

2022-08-15 07:33:17 字數 2527 閱讀 4288

是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

下面我求下圖,從頂點v1到其他各個頂點的最短路徑

首先第一步,我們先宣告乙個dis陣列,該陣列初始化的值為: 

我們的頂點集t的初始化為:t=

既然是求 v1頂點到其餘各個頂點的最短路程,那就先找乙個離 1 號頂點最近的頂點。通過陣列 dis 可知當前離v1頂點最近是 v3頂點。當選擇了 2 號頂點後,dis[2](下標從0開始)的值就已經從「估計值」變為了「確定值」,即 v1頂點到 v3頂點的最短路程就是當前 dis[2]值。將v3加入到t中。 

為什麼呢?因為目前離 v1頂點最近的是 v3頂點,並且這個圖所有的邊都是正數,那麼肯定不可能通過第三個頂點中轉,使得 v1頂點到 v3頂點的路程進一步縮短了。因為 v1頂點到其它頂點的路程肯定沒有 v1到 v3頂點短.

ok,既然確定了乙個頂點的最短路徑,下面我們就要根據這個新入的頂點v3會有出度,發現以v3 為弧尾的有: < v3,v4 >,那麼我們看看路徑:v1–v3–v4的長度是否比v1–v4短,其實這個已經是很明顯的了,因為dis[3]代表的就是v1–v4的長度為無窮大,而v1–v3–v4的長度為:10+50=60,所以更新dis[3]的值,得到如下結果: 

因此 dis[3]要更新為 60。這個過程有個專業術語叫做「鬆弛」。即 v1頂點到 v4頂點的路程即 dis[3],通過 < v3,v4> 這條邊鬆弛成功。這便是 dijkstra 演算法的主要思想:通過「邊」來鬆弛v1頂點到其餘各個頂點的路程。

然後,我們又從除dis[2]和dis[0]外的其他值中尋找最小值,發現dis[4]的值最小,通過之前是解釋的原理,可以知道v1到v5的最短距離就是dis[4]的值,然後,我們把v5加入到集合t中,然後,考慮v5的出度是否會影響我們的陣列dis的值,v5有兩條出度:< v5,v4>和 < v5,v6>,然後我們發現:v1–v5–v4的長度為:50,而dis[3]的值為60,所以我們要更新dis[3]的值.另外,v1-v5-v6的長度為:90,而dis[5]為100,所以我們需要更新dis[5]的值。更新後的dis陣列如下圖: 

然後,繼續從dis中選擇未確定的頂點的值中選擇乙個最小的值,發現dis[3]的值是最小的,所以把v4加入到集合t中,此時集合t=,然後,考慮v4的出度是否會影響我們的陣列dis的值,v4有一條出度:< v4,v6>,然後我們發現:v1–v5–v4–v6的長度為:60,而dis[5]的值為90,所以我們要更新dis[5]的值,更新後的dis陣列如下圖: 

然後,我們使用同樣原理,分別確定了v6和v2的最短路徑,最後dis的陣列的值如下: 

求給定加權圖g =(v,e)的單源最短路徑的成本 請以g的頂點0為起點,輸出0到各頂點v的最短路徑上各邊權值的總和

輸入:第一行輸入g的頂點個數n。接下來n行按如下格式輸入各頂點u的鄰接表  u k v1 c1 v2 c2 v3 c3 ......

g各頂點編號分別為0至n-1。u代表頂點編號,k代表u的出度,vi(i=1,2,3...k)代表與u相鄰的頂點編號v及u到v的有向邊的權值c

按順序輸出各頂點編號v到0的最短距離

#include #include 

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f

;int

main()

}for(int i=0;i//

初始化dis陣列

dis[i] = road[0

][i];

vis[

0]=1

;

int flag=0

;

inti,j;

while(1

)

}if(flag == 0)break;//

全部被標記過 跳出while迴圈

vis[j] = 1

;

for(int i=0;i//

比較更新dis陣列的值

}for(int i=0;i)

printf(

"%d %d\n

",i,dis[i]);

}return0;

}

Dijkstra最短路徑演算法

基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...

Dijkstra最短路徑演算法

引入 dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。package dijkstra p...

最短路徑 Dijkstra演算法

最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...