Single Source Shortest Paths

Dijkstra

note:该算法只能处理有向图中边权值非负的情况

算法特征如下
  1. 算法维护着一个点集S(初始为空),其中点集中的点均已确定了最短路径
  2. 算法维护着一个优先队列Q(priority queue V-S,初始为V),每次从Q中取出一点v加入S中,直到Q为空结束。这里的优先队列的比较参数是某一点v到源点s的预测距离,初始化后,源点为0,其他为正无穷(因此第一次会先从优先队列里取出源点)
  3. (relax)每一次从Q中取出点v后还要跟新优先队列,具体算法是遍历所有与v相邻的边e(v,u),对于每一个点u,若当前的预测距离大于v的预测距离(此时v的预测距离为准确的最小距离)加上权值(v,u)则更新u的预测距离。
算法的理论依据

对于优先队列Q中取出的点v的最短路径必然不经过队列Q中的其他点,因此可直接加入已确定路径的点集S中。因为S中不仅是已计算完成的最短路径,还是所有最终完成计算的最短路径中路径数值最小的顶点。

Bellman-Ford

该算法则直接遍历所有的边|V|-1次。对于每遍历一条边e(v,u),若u的预测距离大于v的预测距离加权值(v,u),则更新u的预测距离(和Dijkstra的relax操作类似)。该算法相比于Dijkstra算法来说优势在于允许负权边的存在,并且可以检测负权环的存在。即在最后遍历所有的边e(v,u),若v预测距离加上权值(v,u)小于u的权值则表明有负权环的存在。而对于遍历|V|-1次的解释:
可以想象Bwllman-Ford算法第i次遍历所有边就会的出所有最短路径中边数为i的定点,当然我们并不不能再过程中知道那些点只需要i条边组成最短路径,但是上帝知道(这里的体现是在之后的遍历中这些点的预测距离都不会被改变)。而所有最短路径中边的长度不会超过|V|-1,所以只需遍历|V|-1次即可。

DAGs

准确的说是在有向无环图中计算单源最短路径,该算法的思想和Bwllman-Ford异曲同工。不在于该算法首先进行的是拓扑排序,然后根据排序的结果遍历每一个顶点v,对于每一个顶点v,遍历它的所有向边(v,u),并对它进行relax操作。该算法优于Bwllman-Ford的原因是可以避免一些不必要的操作。仔细想想是不是Bwllman-Ford中每一次遍历所有的边都会有很多无用操作(上帝视角)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值