algorithm-SPFA
SPFA算法
概念
SPFA算法是一种基于Bellman-Ford算法的改进版本,它用于计算图中各节点到源节点的最短路径。与Bellman-Ford算法不同的是,SPFA算法使用了队列来优化计算,从而在某些情况下加速了计算过程。
SPFA算法的基本思想是从源节点开始,将源节点放入队列中,然后不断从队列中取出节点,考察它的邻接节点,以更新到这些邻接节点的最短距离。如果某个节点的最短距离被更新,且该节点不在队列中,那么将该节点加入队列中,以便后续继续考察。
复杂度是O(V*E)
步骤
-
初始化:将源节点的最短距离设置为0,其他节点的最短距离设置为无穷大(或一个足够大的值),并将源节点加入队列中。
-
迭代处理队列中的节点:
- 从队列中取出一个节点。
- 考察该节点的所有邻接节点,如果通过当前节点到达邻接节点的路径比已知的最短路径更短,则更新邻接节点的最短路径。
- 如果邻接节点的最短路径被更新,且邻接节点不在队列中,将它加入队列中。
-
重复步骤2,直到队列为空。
-
最短路径计算完成后,可以从源节点到任意目标节点的最短路径已知。
原则
- 只让当前点能到达的点入队
- 如果一个点已经在队列里,便不重复入队
- 如果一条边未被更新,那么它的终点不入队
原理
假设,我们的目标是松弛完S->P1->P2->...D
,所以我们先把S
能到达的所有点加入队列,
P1
则一定在队列中。然后对于队列中每个点,我们都把它能到达的所有点加入队列(不重复入队),
这时我们又可以保证P2
一定在队列中。另外注意到,假如Pi->Pi+1
是目标最短路上的一段,
那么在松弛这条边时它一定是会被更新的,所以如果一条边未被更新,它的终点就不入队。
模板
1 | class SPFA { |
题解
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BUGHERE の 博客!
评论