图论入门(2):Dijkstra算法(POJ 2387)

Dijkstra算法是图论的基本算法,适用于求单源最短路径,同时它也是一种典型的贪心算法,所以它所得到的解未必就是最优解,这也是它的局限性。以下是POJ上的模板题:http://poj.org/problem?id=2387由于之前用链表做了多次结果一直RE,最后找不到bug只好看别人解法用数组完成。这一次我就不一一解释代码了,只说一下大概的思路(图用一个邻接矩阵来储存): ①Dijkstra算法
摘要由CSDN通过智能技术生成

Dijkstra算法是图论的基本算法,适用于求单源最短路径,同时它也是一种典型的贪心算法,所以它所得到的解未必就是最优解,这也是它的局限性。

以下是POJ上的模板题:http://poj.org/problem?id=2387

由于之前用链表做了多次结果一直RE,最后找不到bug只好看别人解法用数组完成。(RE的原因是因为链表中的节点都是在main函数内动态分配的,而动态分配太多,一般超过100左右就会自动RE, 声明成全局变量就可以了

这一次我就不一一解释代码了,只说一下大概的思路(图用一个邻接矩阵来储存):
①Dijkstra算法首先将起点的权重设置为0,并将其余的点权重设置为无穷大,再设置一个标记数组记录有多少点已经遍历过(遍历过的点即默认当前点的权重为最短路径)。
②构造一个优先队列,将起点入队,再出队(出队意味着这个点已经被遍历同时要更新标记数组)并将起点邻接的没有记录的点入队,入队时应判断从当前点到邻接点距离是否小于邻接点的权重,若小于则应重新赋值入队点的权重。
③按照第二步的步骤,每一次将权重最小的点出队(能进队列肯定都是没有遍历过的点,贪心算法的体现)。结束的标志就是所有点都已经遍历了一遍。
④dijkstra算法优化的地方大概就是优先队列这里了,相比一般的优先队列,可以考虑用二叉堆来优化。(使用二叉堆优化的时候要考虑优先队列会有重复的两个编号值的问题,他们的权重却不一样,这是个致命bug相

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值