之前只是背了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博客