SPFA算法的简单描述

SPFA(Shortest Path Faster Algorithm)算法与Dijkstra算法一样都是寻找图中两点之间最短路径的算法。但是当图中有负长度的路径时,Dijkstra算法就不可以使用了,但是SPFA算法依旧可以在不出现负环的情况下使用。

算法思路

SPFA算法因为与贝尔曼福德(Bellman-Ford)算法比较相似,只是在它的算法的基础上进行了队列优化。

把起始节点推入队列,循环遍历队列。每次从队头取出一个节点,如果可以通过该节点更新起始节点到其他节点最短距离的时候,我们就更新所有它能到达的子节点的距离,如果更新路径的节点没有在队列中,就把它推入队列,然后继续遍历队列,直到队列为空。这时我们就能得到起始节点到其他节点的最短路径。

准备

做出点边关系的矩阵或其他数据模型这里就不说了。假设起始节点为A。

几乎所有的寻找最短路径方法都是以做表,松弛两个操作为主的。SPFA算法也是如此,首先我们需要一个长度为节点数量n的数组w表示起始节点到所有节点的最短路径表。并把除了0位的其他位的值修改为一个最大值。表示这时初始节点到它本身的距离位0,到其他节点的距离为无限大。

然后还需要一个长度为节点数量n的数组v表示相应节点是否在队列中。(起始节点A开始时要入队)

需要一个队列用于遍历松弛节点之间的距离,并把其实节点入队。

寻找最短路径

遍历队列,当队列不为空时,队头出队,判断能否通过该节点缩短起始节点到其他节点的距离,达到松弛的目的。如果能,就更新距离,并且把更新了距离且不在不在队列中的节点入队。

 

第一次队头出队

A节点出队,然后判断通过A节点是否能松弛起始节点到各节点的距离。这里遍历A节点的出路可知A有到B,C,D有出路,并且可以松弛起始节点到B,C,D的路径,于是就更新数组w的对应位置。并且节点B,C,D并不在队列中,就把他们入队。这时各个数组和队列如下图。

 

第二次队头出队

B节点出队,遍历B节点的出路可知B节点到F节点有出路且可以松弛最短路径,于是更新最短路径表w。F节点不在队列中,所以F节点入队,修改是否在队列信息表v,设置F节点的值为true。由于B节点出队,设置B节点值为false。

 

第三次队头出队

C节点出队,C节点没有出路,仅仅把它在数组v的值改为false即可。

 

第四次队头出队

D节点出队,通过D节点,起始节点A到E节点和F节点的最短路径可以得到更新,于是更新数组w的E节点对应的值和F节点对应的值,并且把不存在于队列的E节点入队。

 

第五,六次队头出队

由于队列中剩下的节点F,E都没有出路,于是他们出队时仅仅修改数组v中对应的值即可。这时队列为空,循环遍历停止。得到起始节点A到图中各节点的最短路径(数组w)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值