《经典图论算法》SPFA算法

摘要:

1,SPFA算法的介绍

2,SPFA算法的解题步骤

3,SPFA算法的负权回路判断

4,SPFA算法的代码实现

5,SPFA算法的几种优化方式(SLF,LLL,堆,栈)

6,SPFA算法和Dijkstra堆优化的区别

1,SPFA算法的介绍

SPFA(Shortest Path Faster Algorithm)最短路径快速算法,是求单源点最短路径的,可以有负权边,但不能有负权回路,实际上它是对 Bellman-Ford 算法使用队列的一种优化。

我们再来回顾下前面讲的Bellman-Ford算法原理,它是每次遍历所有的边然后判断是否能松弛。如下图所示,假设刚开始的时候先计算 <1,3> 这条边,因为顶点 1 的值还没有被更新,起始点到顶点 1 的值是无穷大,用顶点 1 的值去更新顶点 3 是更新不了的。

9b66aea1da7128889385b22cf75b1869.png

同理如果顶点 3 的值没有更新,用 <3,4> 这条边计算顶点 4 的值也是更新不了的,所以我们发现一个问题就是在遍历 <x,y> 这条边的时候,如果顶点 x 的值没有改变,那么通过这条边计算 y 的值也不会改变,也就是说使用Bellman-Ford算法会出现大量无效的计算。

解决方式也很简单,就是如果某个顶点的值改变了,我们再来计算它指向的点,如果某个顶点的值没有改变,就不需要计算它指向的点,这个就是 SPFA 算法。

2,SPFA算法的解题步骤

SPFA算法和Bellman-Ford算法类似,只不过SPFA算法并不是每次都盲目的计算所有的边,SPFA算法需要使用一个队列,如果某个顶点的值改变了,它不在队列中,就把它添加到队列中,因为它改变了,它指向的点才有可能改变,所以这里只需要遍历队列中的顶点即可,如下图所示。

c451096bb062d6d1649e688b2e2946a2.png

194d33e222f0f569b329fc5a99668a47.png

639f705ecba55335d07122fb497ec3f1.png

4a92b7a3a980c03b3247e2b777ac9957.png

我们可以看到顶点 1 和顶点 4 都入队了两次,也就是说在SPFA算法中,一个顶点只要不在队列中,它是可以再次入队的。

它的解题步骤如下:

1,从起始点开始,更新它指向的点,更新之后,把它指向的点添加到队列中。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值