SPFA回忆小结
written on 2022-07-22
之前比赛有遇到最短路相关的,稍作了变形,发现自己并不是很熟练,对算法本质并不透彻,故作此篇。
\(\tt{SPFA}\) 的适用环境:
- 判负环
众所周知 \(\texttt{SPFA}\) 是可以判断负环的,这在差分约束中常用,当然图论本身更常用。 其方法就是,假设存在 \(n\) 个点,在跑 \(\texttt{SPFA}\) 时,新开一个 \(cnt\) 数组记录每一个节点的入队次数,要是没有负环,那么与 \(\texttt{Floyd}\) 原理类似,每个节点最多被松弛 \(n\) 次,因此若 \(cnt_x\gt n\),那么存在负环。
- \(\texttt{SLF}\) 优化
本质就是用双端队列优化,将当前松弛的元素与队头元素比较,若更小则塞入队头,否则塞入队尾。这样的话因为它更“松”,所以类似于贪心的,会更优。
另外注意一下,要是存在负边权,不能使用 \(\tt{Dijkstra}\),但是可以用 \(\tt{SPFA}\),要是存在负环,那都不能用。