SPFA 的优化
作者:互联网
引
众所周知,SPFA作为一种暴力单源最短路算法,卡掉它并不是什么难事,毕竟,毕竟。
如果想卡 SPFA 见:「笔记」如何优雅地卡 Spfa - Luckyblock
但是我们可以优化……
但是优化也可以卡
SLF 优化
\(Small \ Label \ First\) 优化(小标签优先)。用双端队列 \(deque\) 实现,常用。
就是更新完之后比较其 \(dis\) 值与 \(dis[q.front()]\) 的大小,如果较小则放前面,反之放后面。
原理就是 \(dis\) 值小的更容易更新其他节点的 \(dis\) ,使队列后面的节点尽量不满足 \(dis[v]>dis[u]+w\),这样就避免了一部分的重复入队。
复杂度 \(\mathcal{O(\text{玄学})}\)。
LLL 优化
\(Large\ Label\ Last\) 优化(大标签最后)。
设队首元素为 \(temp\) ,每次松弛时进行判断,队列中所有 \(dis\) 值的和为 \(sum\),队列元素个数为 \(num\)。
若 \(dis[temp] \cdot num > sum\) ,则将 \(temp\) 取出插入到队尾,查找下一元素,直到找到某一个 \(temp\) 使得 \(dis[ temp ] \cdot sum \le x\) ,则将 \(temp\) 出队进行松弛操作。
和 SLF 优化原理差不多,因为比平均值小的 \(dis\) 更容易更新别的 \(dis\) 从而减少入队次数。
SLF + LLL 优化
因为这俩玩意互不影响,一个判出队,一个判入队,结合起来一样用。
就像 T-34-85 遇见了 SU-100,同志柏林见。
DFS优化
这玩意可以判环,因为依靠队列判环至少需要一个点重复进队 \(n\) 次,所以极易 GG。
DFS 优化可以凭借一个 \(vis\) 数组将判环的复杂度降到到 \(\mathcal{O(\text{E})}\)
蛋是,要是没环,见 LB 如何卡 SPFA 。
复杂度指数级。
标签:temp,队列,入队,SPFA,优化,dis 来源: https://www.cnblogs.com/BlackDan/p/16098485.html