SPFA是按照 FIFO 的原则更新距离的, 没有考虑到距离标号的作用。实现中 SPFA 有两个非常著名的优化: SLF 和 LLL。
SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j) < dist(i),则将j插入队首,否则插入队尾。
1 | #include <iostream> |
LLL:Large Label Last 策略,设队首元素为i,每次弹出时进行判断,队列中所有dist值的平均值为x,若dist(i)>x则将i插入到队尾,每次出队时,若 d[i]>平均值,把 i 移到队列末尾,如此反复,直到找到某一i使得dist(i)<=x,则将i出队进行松弛操作。
1 | #include <iostream> |