再论单源最短路径-SPFA

之前只是背了SPFA的算法模板,但是没有真正理解其中含义。这里复习时再次进行理解。

首先,正常的单源最短路径都会由下面的一个结构来维护“距离”,这个结构可以用一个数字dist[N]来描述,其中下标为顶点编号,值为“暂时的最短路径”(最开始的状态,需要将起点设置为0,其余的都设置为inf。)

算法图解

比如要求从A到E的最短距离:

初始状态,A距离A的距离为0,其余都为INF,首先将A入队。

然后将A出队,遍历A出发的边(如果是无向图,也是同样的道理),注意:只有距起点变小的点才加入队列(因为如果a-->b。只有a变小了,b才能可能由a推出来变小。)更新距离。

然后B出队(这里B指向了D)更新距离。D变小了,D入队。

C出队,没有需要更新的点。

D出队,更新E,E入队。

E出队,这是E指向C,但是C没有变小。所以不更新也不入队。队列为空完成。

这个算法的算法的主要思想就是,我们从更新点的距离出发,想一下什么样的点可以被更新距离?

显然a-->b,只有a变小了那么b才有可能变小。所以,我们从起点出发,遍历其可以到达的点,在这些点中,只有距离变小的我们才将其加入队列(方便遍历下一个)。如果距离没有变小,那么一定不能通过这个点更新其后面的点(a-->b,如果a没有变小,那么b就不可能由a过来的路线而变小)。

queue<--1

while queue非空

1.  t<--q.front();

     q.pop();

2.更新t的所有出边 t-->b

    queue<--b

如果想看其他最短路径算法请观看:图论之最短路径问题(朴素Dijksra算法\堆优化版Dijksra算法\Bellman-Ford\SPFA)-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

背水

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

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

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

打赏作者

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

抵扣说明:

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

余额充值