SPFA

时间复杂度

伪代码

1
2
3
4
5
6
7
8
9
10
Queue q
q.add(s) // s的距离初始为0, 其他顶点的距离初始为Infinity

while(!q.isEmpty())
v = q.remove()
for (w : v.adjs) // w是v的邻接顶点
if(dv + d(v, w) < dw)
dw = dv + d(v, w)
if(!q.contains(w)) //检查w是否在当前队列中,不在则入队
q.add(w)

时间复杂度分析

SPFA算法过程中,顶点一层一层地入队出队,一张图最多有层(以为第层),所以按层计,顶点最多入队次。第层顶点个数为,其余每层顶点数不会超过(第行所保证)。这里重点解释一下,一个顶点可能会通过不同的路径重复属于某一层,例如 ,没有第行检查的话,可以在第层顶点里出现两次。但有了第行,使得一个顶点只能在一层顶点里出现一次,否则算法复杂度将超过,后面还会讨论这种情况。当第一层有 个,其余所有层都有个顶点时达到复杂度上限。

除第层外每一层顶点入队引起次松弛尝试,除第一层外的其他层的总时间复杂度为。因为第一层(顶点)引起的松弛尝试不会超过,所以总的时间复杂度为