概述
spfa是基于bellman-ford算法(以下简称bf算法)改进的。也即将bf算法放入队列实现。
说明
当然bf算法还有一种优化方法就是。在外层循环k时,如果发现在构造新的一层路径生成树时整个树没有更新。这样可以直接跳出。具体实现可以在循环中加一个flag判断一下。
文字基于您已熟知spfa以及bf算法。
负环判断方法
1.bf算法更新完状态数组后,再遍历边集,如果对任意e(v,u):
d[u] > d[v]+w[v][u];
那么有负环
2.在spfa中判断:
用一个数组c储存每个点入队的次数,如果大于n次。
则有负环。
首先说更新一个状态数组值但是它因为可能已经标记访问了所以未必进队。
此外,我们知道一个点会被更新多次但是不会超过n-1(因为树高就是n-1)
如果有负环,spfa算法一定是不会终止的入队一旦大于n次就可以说明已经进入死循环了。所以可以退出了。