最近上圖論,學了單源最短路徑的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 45const
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...