最短路徑(一) dijkstra

2022-08-26 01:00:25 字數 2270 閱讀 2986

步驟已用點

路徑(a->b:權值)

最短路徑

未用點b(遍歷點)

1設定矩陣weight,記錄各點間距離(m為不可到達),設定起始點start,weight[start][i]記錄start到各點的最短距離,shortpath[i]記錄最短路徑,shortpath[start]預設為0

0->0:0 

0,1,2,3,4

2讓start=0,0作為原點,標為已用,用bool[0]=1表示,比較0到其他未用點的距離,選取其中權值最小的路徑作為一條最短路徑(權值最小,不可能有通過其他點到達該點權值更小的路徑),得到最短路徑頂點為3

00->1:13

0->2:m

0->3:6

0->4:11

0->3:6

1,2,3,4

3獲取通過3到其他各點的距離,與原weight[start][i]中值比較,使weight[start][i]中均為start到各點的最短距離,再次比較weight[start][i]中除到0,3點的最小值,獲得第三條最短路徑,路徑頂點為4

0,30->3->1:m(0->1:13)

0->3->2:23(0->2:m)

0->3->4:10(0->4:11)

0->3->4:10

1,2,4

4重複步驟3

0,3,4

0->3->4->1:19(0->1:13)

0->3->4->2:13(0->3-2:23)

0->1:13

(此處到1,2距離相等,應均為最短路徑,但為了**方便,選其中一條路徑)

1,25

重複步驟3 

0,1,3,4

0->1->2:16(0->3->4->2:13) 

0->3->4->2:132 6

獲得所有最短路徑,可輸出(遍歷完所有點)

0,1,2,3,4

對應圖:

對應**:

1

static

int m=10000; //

不可到達,不可設定為int型別最大值,否則下面相加時會出錯

2public

static

void

main(string args),//

v0到v0,v1,v2,v3,v4

6 ,//

v1到v0,v1,v2,v3,v4

7 ,

8 ,

9

10};

11//

起始點start

12int start=0;

1314

//最短路徑:

15dijkstra(weigth,start);

16}

17private

static

void dijkstra(int weigth, int

start)

2930

for(int count=1;count)

37 }//

求start到其餘各點中權值最小的點

38 bool[k]=1;//

標記已使用點

39 distance[k]=minpath;//

獲得點0到點k的最小距離

40for(int i=0;i)

45 }//

求start->k->其餘各點的距離,若小於start->其餘各點距離,將weigth[start][i]設為那個更小的距離,shortpath記錄經歷的路徑

4647}48

49//

顯示輸出

50for(int i=0;i)

5354 }

運算結果:

從0到0的最短路徑為:0->0;最短距離為:0從0到1的最短路徑為:0->1;最短距離為:13從0到2的最短路徑為:0->3->4->2;最短距離為:13從0到3的最短路徑為:0->3;最短距離為:6從0到4的最短路徑為:0->3->4;最短距離為:10

Dijkstra 最短路徑

dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...

dijkstra最短路徑

hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...

最短路徑 Dijkstra

首先,提出兩點 一 如果把不帶權圖上的所有邊的權值均定義為1,則該不帶權圖可以歸結為帶權圖 二 如果把無向圖中的每一條邊 vi,vj 都定義為弧和弧,則該無向圖可以歸結為有向圖。因此不失一般性,我們只用看有向帶權圖怎麼求解最短路徑問題就ok。帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路...