Dijkstra演算法,有權單源最短路徑
阿新 • • 發佈:2018-11-22
與無權單源最短路徑相似,與層次遍歷相似;以遞增的順序依次收錄遇到的最短距離的頂點
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;
}