透析SPFA算法(图例讲解)

本文介绍了SPFA算法,它是Bellman-Ford算法的优化,用于处理带有负权值边的单源最短路径问题。SPFA通过队列优化,在平均情况下,时间复杂度为O(kE),k通常小于2。算法流程包括初始化、使用队列进行松弛操作和负权环检测。SPFA与Dijkstra算法的主要区别在于它会多次更新路径,而Dijkstra一旦更新就不变。
摘要由CSDN通过智能技术生成

      

                   

      SPFA算法是Bellman-Ford的队列优化,所以先介绍Bellman-Ford算法。

       Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。

         Bellman-ford算法是求解连通带权图中单源最短路径的一种常用算法,它允许图中存在权值为负的边。 同时它还能够判断出图中是否存在一个权值之和为负的回路。如果存在的话,图中就不存在最短路径(因为,假设存在最短路径的话,那么我们只要将这条最短路径沿着权值为负的环路再绕一圈,那么这条最短路径的权值就会减少了,所以不存在最短的路径,因为路径的最小值为负无穷),如果不存在的话,那么求出源点到所有节点的最短路径。

 

Bellman-Ford算法的限制条件:

 要求图中不能包含权值总和为负值回路(负权值回路),如下图所示。


如果包含了负回路的话,0-1的最短距离可以无限-2+1-2+1...趋近负无穷

三、Bellman-Ford算法思想






考虑:为什么要循环V-1次?

答:因为最短路径肯定是个简单路径,不可能包含回路的,

如果包含回路,且回路的权值和为正的,那么去掉这个回路,可以得到更短的路径

如果回路的权值是负的,那么肯定没有解了

图有n个点,又不能有回路

所以最短路径最多n-1

又因为每次循环,至少松弛一边

所以最多n-1次就行了

 

介绍一下松弛计算

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值