最短路徑演算法 Dijkstra

2022-03-08 03:49:48 字數 1946 閱讀 5625

最近上圖論,學了單源最短路徑的dijkstra演算法。

dijkstra演算法的核心思想是貪心策略+動態規劃。

老師隻字不提思想,硬分析過程還是有點@#$%的。

結果就是,原先我還挺懂的,聽完就凌亂了。

在這裡寫一下吧

參考資料:

wikipedia:'s_algorithm

nocow:

clrs

《演算法設計與分析》

演算法流程:

在以下說明中,s為源,w[u,v]為點u和v之間的邊的長度,結果儲存在dis

初始化:源的距離dis[s]設為0,其他的點距離設為無窮大(實際程式裡設成-1了),同時把所有的點的狀態設為沒有擴充套件過。

迴圈n-1次:

在沒有擴充套件過的點中取一距離最小的點u,並將其狀態設為已擴充套件。

對於每個與u相鄰的點v,執行relax(u,v),也就是說,如果dis[u]+map[u,v]結束。此時對於任意的u,dis[u]就是s到u的距離。

wiki上有個很好的圖,可以幫助理解演算法過程:

測試資料來自清華的紫皮演算法書,如下:

迭代過程如下:迭代s

udis[2]

dis[3]

dis[4]

dis[5]

初始---

10-1

3010012

1060

3010024

1050

309033

1050

306045

1050

3060

看上面的兩個圖,基本就能把dijkstra演算法的具體過程了解清楚。

演算法正確性證明可以看wiki和clrs。

程式如下(測試資料就是上面的,輸出了6個結果):

int dijk(int s, int e);函式返回從s到e的最短路。

1 #include 2 #include 3 #include 45

const

int n = 6;6

intmap[n][n];78

int dijk(int s, inte)9

;12intmin, next;

13 memset(dis, 255, sizeof(dis));//

把所有未更新的dis設定成-1

1415 dis[s] = 0; //

從s開始

1617

for (int i=1; ii)

1827}28

if (min !=int_max)

2938}39

}40}41

return

dis[e];42}

4344

45int

main()

4653}54

55 map[1][2] = 10

;56 map[1][4] = 30

;57 map[1][5] = 100

;58 map[2][3] = 50

;59 map[3][5] = 10

;60 map[4][3] = 20

;61 map[4][5] = 60;62

63 printf("

%d %d %d %d %d %d\n

", dijk(1, 5), dijk(2, 3), dijk(1, 5), dijk(4, 5), dijk(1, 2), dijk(2, 4

));64

6566

return0;

67 }

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...