1. 程式人生 > >Dijkstra演算法,有權單源最短路徑

Dijkstra演算法,有權單源最短路徑

與無權單源最短路徑相似,與層次遍歷相似;以遞增的順序依次收錄遇到的最短距離的頂點

int findmin(Graph G,int dist[],int collected[]) // 找到一個未被收錄的最小值
{
	int Min = MAXNUM; // 儲存最小值,初值為無窮大;
	int Mv;	// 儲存最小值的位置
	for(int v = 0; v = G->Nv ; v++) // 遍歷dist,找到未被收錄的最小值
	{
		if(collected[v] ==false && dist[v] < Min) 判斷是否為未被收錄的最小值
		{
			Min =
dist[v]; Mv = v; } } if(Min < MAXNUM) { return Mv; // 返回最小值的頂點 } else { return -1; // 返回錯誤值 } }
bool Dijkstra(Graph G,int S) // S點作為原點,找到其它點距離S點的最短路徑
{
		int dist[Maxnum]; // 陣列初始化為無窮大值,用於儲存距離
		int path[Maxnum];//初始化為-1,用於儲存路徑
		bool collected[Maxnum]; // 陣列初始化為false;記錄點是否被收錄
		Adj W; int
V; for(W = G->G[S].FirstEdge ; W ; W = W->next) // 初始化與S 點直接連通的點,把距離更新; (直接連通的點,最短路徑為邊的權值) { dist[W->Adjv] = W->weight; // 更新距離 path[W->Adjv] = S; // 更新路徑; } dist[S] = 0; // 到自己的距離為0; collected[S] = true; // 收錄該點; while(1) { V = findmin(G,dist,collected); // 找到一個最小值 ; if
(V == -1) // 如果是錯誤的值 { break; } collected[V] = true; // 收錄節點 for(W = G->[V].FirstEdge ;W ; W=W->next) // 訪問與該點相連通的點 { if(collected[W->AdjV] == false) // 未被訪問, { if(W->weight < 0) // 存在負值 { return false; // Dijkstra演算法不能解決負值問題 } if(dist[W->AdjV] > dist[V] + W->weight) // 如果當前路徑距離比原來距離小,更新距離 { dist[W->AdjV] = dist[V] + W->weight; // 更新距離 path[W->AdjV] = V; // 更新路徑 } } } } return true; }