本文記錄一下dijkstra演算法的實現,圖用鄰接矩陣表示,假設圖為無向圖,並且連通,有向圖,不連通圖的做法類似。
演算法簡述:
首先確定「單源」的源,假設是第0個頂點。
維護三個陣列dist, color, path,設其下標分別為0…i…n-1:
dist 表示源點到頂點i的最短距離,在初始化時,如果源點到頂點i有路徑,則初始化為路徑的權重,否則初始化為int_max;
color 陣列其實表示兩個集合,即color[i]值為1的集合表示已經確定最短路徑的點的集合,color[i]值為0表示沒有確定最短路徑的點的集合。初始化為將源點的color設定為1,其餘點設定為0;
path陣列儲存到頂點i的路徑,如果path[i]=3,path[3]=2,paht[2]=0,則這條最短路徑是0->2->3->i,與陣列給出的順序是逆序。
依次從dist陣列中選乙個最小的dist值,假設頂點的座標為index,這個dist值即為最終確定的最短距離的點,更新這個點的color值為1,下面乙個操作是dijkstra演算法的重點,也只有這麼乙個重點操作,即:在沒有確定最短距離的集合中(即color值為0的點的集合),如果源點到index的距離,加上index到這些點的距離小於原來的dist值,則更新dist值,同時更新path值。
重複第3個操作,直到color值為0的集合為空。
下面給出c語言實現**,方法都出了注釋,這裡不再說明, 如果不足之處請提出(使用的預設的圖如下):
int source = 0; //求從第0個節點到其他節點的最短路徑
int* dist;
int* path;
int* color; //顏色為1說明已經找到最短路徑,為-1說明沒找到最短路徑
//獲得預設的圖,即上圖所示,使用鄰接矩陣表示
int** get_graph(){
int** matrix;
int i,j;
int start,end,weight;
printf(input vertex num:
); scanf(%d,&n);
matrix = (int**)malloc(sizeof(int*)*n);
for(i=0;i
執行結果如下:
Dijkstra 單源最短路徑
演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...
Dijkstra 單源最短路徑
演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...
Dijkstra單源最短路徑
dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...