步驟已用點
路徑(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。帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路...