SPFA算法详解 单源最短路算法 Bellman-Ford队列优化

SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE)。
SPFA算法的全称是:Shortest Path Faster Algorithm,是西南交通大学段凡丁于 1994 年发表的论文中的名字。不过,段凡丁的证明是错误的,且在 Bellman-Ford 算法提出后不久(1957 年)已有队列优化内容,所以国际上不承认 SPFA 算法是段凡丁提出的。

SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它还有一个重要的功能是判负环

如果没必要判负环建议使用Dijkstra

SPFA判断负环:如果一个点进入队列达到n次,则表明图中存在负环,没有最短路径。

因为有负权 , 所以每次松弛操作都能更新最小值,就一直循环操作下去

主要思想及方法:

设一个数组用来存储源点到其他顶点的最短路径 , 初始化时 , 其他顶点为无穷。

再设立一个队列 ,读取队头顶点u,并将队头顶点u出队(记得消除标记);将与点u相连的所有点v进行松弛操作,如果能更新估计值(即令d[v]变小),那么就更新,另外,如果点v没有在队列中,那么要将点v入队(记得标记),如果已经在队列中了,那么就不用入队

以此循环,直到队空为止就完成了单源最短路的求解

#inc
posted @ 2020-11-20 19:23  榴恋666  阅读(152)  评论(0编辑  收藏  举报