資料結構 最短路徑之—迪傑斯特拉演算法

PengPengBlog發表於2017-02-23
#define MAXVEX 9
#define INFINITY 65535

typedef int PathMatrix[MAXVEX]			//用於儲存最短路徑下標的陣列
typedef int ShortPathTable[MAXVEX]		//用於儲存到各點最短路徑的權值和  比如V0到V2的權值是4 


void ShortestPath_DIJ(MGraph G, int V0, PathMatrix &P, ShortPathTable &D) //介面:輸入的是無向圖G,初始點VO,路徑矩陣P,以及路徑表格,
{

	int final[MAXVEX]; //final[v] = 1 表示已經求得頂點V0到Vw的最短路徑。為1的話表明已經取得,為0的話表明還沒有取得。


	//初始化資料 初始化資料用的是v0到其他各個結點的長度。
	for(v=0; v<G.numVertexes; v++)
	{
		final[v] = 0;			//全部頂點初始化為未找到的最短路徑,所以初始化都為0
		(*D)[v] = G.arc[v0][v];		//將與v0點有聯絡的頂點加上權值(距離)。  在鄰接矩陣中,從V0到V8的最大頂點數開始遍歷。
		(*p)[V] = 0;                //初始化路徑陣列P為0;
	}
	(*D)[V0] = 0;                  //v0到v0的路徑為0
	final[V0] = 1;                //V0到V0不需要求路徑。

	//開始主迴圈,每次求得V0到某個V頂點的最短路徑 這個迴圈分為兩部分,根prim演算法一樣,先求出第一部分,然後進行糾正更新。
	for(v=1; v< G.numVertexes; v++) //從1開始的,從第一個頂點開始探討 接著從下個結點開始。
	{
		min = INFINITY;

		//從D陣列中找到最小的值。
		for(w=0; w<G.numVertexes; w++)
		{
			if(!final[w] && (*D)[w]<min) 
			{
				k = w;  //k儲存的是距離當前結點距離最近的結點
				min = (*D)[w];
			}	
		}
	
	final[k] = 1;

	//修正當前最短路徑以及距離  要求下一層的結點要小於上一個結點到其他結點的距離。
		for (w=0; w<G.numVertexes; w++)
		{
			if(!final[w] && min+G.arc[k][w] < [*D][w]) //當前的min+其他的。
			{
			    (*D)[w] = min + G.arc[k][w]  //修正當前路徑長度; 利用前驅頂點和其他頂點的長度且和前面的長度累積比大小。
			    (*p)[w] = k;                 //存放前驅頂點。 前驅結點和這個結點相連線的權值之和為<(*D)[k]. 發現用到p沒什麼用!
			}
		}
	}

}

詳情過程可以參考這個! 

https://wenku.baidu.com/view/6dc5c62486c24028915f804d2b160b4e767f810f

相關文章