最短路径算法

本文详细介绍了迪杰斯特拉算法,包括其基本步骤:初始化、选择最近节点、更新距离和标记节点。特别指出算法不适用于负权重图。代码示例展示了如何在AMGraphG结构中实现该算法。
摘要由CSDN通过智能技术生成

迪杰斯特拉(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值