带权路径最短——Dijkstra算法

本文介绍了Dijkstra算法,一种解决带权最短路径问题的经典算法。通过贪心策略逐步确定最短路径,并以邻接表节省空间。文章详细讲解了算法思路,包括使用Known变量跟踪已知顶点,dist变量记录路径长度,以及如何存储路径信息。同时,提供了基于邻接表和遍历的实现方式,以及使用递归打印路径的方法。
摘要由CSDN通过智能技术生成


查看原文:http://www.wyblog.cn/2016/12/09/%e5%b8%a6%e6%9d%83%e8%b7%af%e5%be%84%e6%9c%80%e7%9f%ad-dijkstra%e7%ae%97%e6%b3%95/

Dijkstra算法是经典的求取带权最短路径的算法。 它采用贪心的思想,在每一步仅选取一个能够被确定为从已知顶点到该顶点已经为最短路径的顶点,并动态地去规划该顶点到其他顶点的最短路径距离。 本篇博文算法思想参考自《数据结构及算法分析》这本书,并将书本里的思想以及代码伪码给实现了。 图的实现还是采用邻接表的方式,比较节省空间。在每一步求取未知的最小路径的顶点时,可以采用小顶堆来实现,我这里是采用遍历的方式,因为顶点结构内包含了是否是未知的标记。 从Dijkstra算法的原理上看,要设置的变量有:

  1. 要确定顶点是已知还是未知的,所以需要一个Known变量。
  2. 要确定带权的路径的长度,需要一个dist变量。
  3. 要确定路径信息,所以每一个顶点结构体内部要储存最短路径到达此顶点的上一个顶点。
  4. 路径的权值,就储存在邻接表链表节点的weight变量里。

打印路径信息的函数采用递归的方式,逐层向上查找,直到达到起点。 算法代码如下:


#include<cstdio> #include<iostream> #include<queue> using namespace std; #define MAX_VERTEX_NUM 100 #define Ver
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值