“学习笔记”之《算法导论》----第六部分----图算法----第二十四章----单源最短路径

本人大四即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接

放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以解释数学公式为主。

终于开始介绍有关最短路径的算法了

本章继承了上一章部分内容,G跟上一章不同的是,某些单源最短路径问题可能包括权重为负值的边。

环路

需要注意的是,所有的最短路径的方案,都不包括环路,无论是权重为正值、0、负值的环路。

声明我们的目的:对于s到每个结点v的方案,我们要得到权重最小的路径。

如果存在正值的环路,我们完全可以将其去掉。

如果是负值,我们可以一直绕,那就是负无穷。

如果是0,直接去除就好。 

松弛(重点)

首先测试一下是否可以对从s到v的最短路径进行改善。测试的方法是,将从结点s到结点u之间的最短路径距离加上结点u与v之间的边权重,并与当前的s到v的最短路径估计进行比较,如果前者更小,则对vd和v进行更新。松弛步骤可能降低最短路径的估计值v.d并更新v的前驱属性v.π。

Bellman-Ford算法

这个算法的大概意思

做n-1次松弛操作,对所有的结点进行松弛操作算一次。

这个算法在整体的思路上就是一种眼观全局的思路,整体优化。

有向无环图中的单源最短路径问题

Bellman-Ford算法是可以接受图中含有环路的。现在考虑的问题是图中没有环路。

因为没有权重为负值的环路,最短路径都是存在的。我们的算法先对有向无环图进行拓扑排序,以便确定结点之间的一个线性次序。如果有向无环图包含从结点u到结点v的一条路径,则u在拓扑排序的次序中位于结点v的前面。我们只需要按照拓扑排序的次序对结点进行一遍处理即可个每次对一个结点进行处理时,我们对从该结点发出的所有的边进行松弛操作。

这个算法就比上面那个更直观一些,算法执行的过程是所有结点排好队,一个一个进行松弛操作的,理解算法也更容易。

Dijkstra算法

这个算法像是上面这个的进化版,上面这个不支持带环路,而这个Dijkstra支持带环路,而且思路清晰,如果所采用的实现方法合适,Dijkstra算法的运行时间要低于Bellman-Ford算法的运行时间。

唯一的不足是,该算法处理的图所有边的权重必须是正。

Dijkstra算法在运行过程中维持的关键信息是一组结点集合S,从源结点s到该集合中每个结点之间的最短路径已经被找到。算法重复从结点集V-S中选择最短路径估计最小的结点u,将u加人到集合S,然后对所有从u发出的边进行松弛。我们使用一个最小优先队列Q来保存结点集合,每个结点的关键值为其d值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Naruto

你的鼓励是我的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值