迪杰斯特拉(Dijkstra)算法是一种用于解决带权图中单源最短路径问题的算法。它采用贪心策略,逐步找到从源节点到其它所有节点的最短路径。
以下是迪杰斯特拉算法的基本步骤:
初始化:
创建一个距离数组 dist,其中 dist[i] 表示从源节点到节点 i 的最短距离。初始时,将源节点到自身的距离设为0,将源节点到其它所有节点的距离设为无穷大。
创建一个集合 visited,用于记录已经找到最短路径的节点。初始时,该集合为空。
选择最近节点:
从未访问的节点中,选择距离源节点最近的节点 u。这可以通过遍历 dist 数组实现。
更新距离:
对于节点 u 的所有邻居节点 v,如果通过节点 u 到达 v 的距离(即 dist[u] + weight(u, v))小于当前 dist[v] 的值,则更新 dist[v]。这表示找到了一个更短的路径从源节点到 v。
标记节点:
将节点 u 添加到 visited 集合中,表示已经找到了从源节点到 u 的最短路径。
重复:
重复步骤2-4,直到 visited 集合包含所有节点。
结果:
当算法结束时,dist 数组中的值就是从源节点到其它所有节点的最短距离。
注意:迪杰斯特拉算法不能处理带有负权重的图,因为它依赖于贪心策略,而在负权重的图中,贪心策略可能无法得到最优解。
void Dijkstra(AMGraph G,int v)
{
int dist[MAXV],path[MAXV];//path[]记录到达终点前的最后一个顶点
int s[MAXV];//0表示未加入最短路径顶点集,1已加入
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q; //优先队列,按照距离从小到大排序
int i,u;
for(i=0;i<G.vexnum;i++)//dist和path数组初始化
{
dist[i]=INF;//距离初始化为无穷大
s[i]=0;//s[]置空
path[i]=-1;//路径初始化为-1
}
dist[v]=0;//源点到自身的距离为0
q.push({0,v});//源点入队
while(!q.empty())//队列不为空时循环
{
u=q.top().second;//取出队首的顶点
q.pop();//出队
if(s[u]==1) continue;//如果已经加入最短路径顶点集,跳过
s[u]=1;//否则,将其加入最短路径顶点集
for(auto e:G.arcs[u])//遍历u的邻接边
if(s[e.v]==0)//如果终点不在s中
if(dist[u]+e.w<dist[e.v])//如果可以更新距离
{
dist[e.v]=dist[u]+e.w;//更新距离
path[e.v]=u;//更新路径
q.push({dist[e.v],e.v});//将终点入队
}
}
Dispath(G,dist,path,s,v);//输出
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_51646682/article/details/131125260