SPFA算法

SPFA算法SPFA算法是西南交通大学段凡丁于1994年发表的。求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。从名字我们就可以看出,这种算法在效率上一定有过人之处。很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。有人称spfa算法是最短路的万能算...
摘要由CSDN通过智能技术生成

SPFA算法

SPFA算法是西南交通大学段凡丁于1994年发表的。求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。从名字我们就可以看出,这种算法在效率上一定有过人之处。

很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。有人称spfa算法是最短路的万能算法。本文中,我们规定有向加权图G不存在负权回路,即最短路径一定存在。

SPFA的算法(动态规划思想)

变量:我们用数组dis 记录每个结点的最短路径值(在目前步骤时),可以用邻接矩阵或邻接表来存储图G。

设立一个先进先出的队列q(C++的建议使用STL)用来保存待处理的结点,将源点放入。每次处理队列首元素u点,并且用u点当前的u点最短路径值对离开u点所指向的结点v进行松弛操作(即从原点到u点然后到v点的路径,判定是否dis[j]>dis[i]+map[i][j],如果该式成立则将dis[j]减小到dis[i]+w[i][j],否则不动),如果v点的最短路径值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。

下面举一个实例来说明SPFA算法是怎样进行的(还是dijkstra算法的例子):

各点之间的距离如表所示。

map i=1 2 3 4 5 6
j=1 0 120 INF 50 INF INF
2 120 0 10 INF INF 30
3 INF 10 0 30 INF INF
4 50 INF 30 0
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值