与无权单源最短路径相似,与层次遍历相似;以递增的顺序依次收录遇到的最短距离的顶点
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;
}