SPFA的几种优化以及Hack的方法

今天在知乎上看见一位奆佬评论
https://www.zhihu.com/question/292283275
总结来说:现在在图论算法中 随手卡 S P F A SPFA SPFA已经是业界常识。 S P F A SPFA SPFA的受到怀疑和最终消亡 是 O I OI OI界水平普遍提高、命题规范完善和出题人使命感和责任心增强的最好见证…竟然把 S P F A SPFA SPFA当成骗分算法
这个讨论因何而起呢 主要是 N O I 2018 D a y 1 T 1 NOI2018Day1T1 NOI2018Day1T1归程出题人卡 S P F A SPFA SPFA使得众多奆佬挂在这道题上 出题人也在讲题中说 S P F A SPFA SPFA已经死了. 所以众多吐槽纷纷而起
在这里插入图片描述
看完感觉十分受益 那么我们一一介绍
首先是我们熟悉的 S L F SLF SLF以及 L L L LLL LLL优化 具体在这篇优秀的道路与航线题解中
传送门: S P F A SPFA SPFA的两种优化
1. L L L LLL LLL优化:每次将入队结点距离和队内距离平均值比较,如果更大则插入至队尾。
H a c k Hack Hack:向 1 连接一条权值巨大的边,这样 L L L LLL LLL 就失效了。
2. S L F SLF SLF 优化:每次将入队结点距离和队首比较,如果更大则插入至队尾。
H a c k Hack Hack:使用链套菊花的方法,在链上用几个并列在一起的小边权边就能欺骗算法多次进入菊花。
3. S L F SLF SLF 带容错:每次将入队结点距离和队首比较,如果比队首大超过一定值则插入至队尾。
H a c k Hack Hack:如果边权之和很小的话似乎没有什么很好的办法,因为令边权之和为 W W W那么令容错值为 W \sqrt{W} W ,总复杂度似乎接近 O ( ( V + E ) W ) O((V+E)\sqrt{W}) O((V+E)W ) S P F A SPFA SPFA 确实在边权和小的时候跑得蛮不错的。所以卡法是卡 S L F SLF SLF 的做法,并开大边权,总和最好超过 1 0 12 10^{12} 1012
4. m c f x mcfx mcfx 优化 ( t h a n k s     t o     m c f x     a n d     @ y f z c s c ) (thanks\,\,\, to\,\,\, mcfx\,\,\, and\,\,\, @yfzcsc) thankstomcfxand@yfzcsc在第 [ L , R ] [L,R] [L,R]次访问一个结点时,将其放入队首,否则放入队尾。通常取 L = 2 , R = V L=2, R=\sqrt{V} L=2R=V
H a c k Hack Hack:网格图表现优秀,但是菊花图表现很差。

P . S . P.S. P.S. 此优化与 S L F SLF SLF 带容错一起使用有更好的效果,可以使所需要的边权上升许多。
5. r a f f i c a ′ s N T R raffica's NTR rafficasNTR:详见 N T R NTR NTR
H a c k Hack Hack:菊花图表现很差。
不过 这篇评论最后还给了我们一些希望:
就是这个优化: S L F + s w a p SLF + swap SLF+swap:每当队列改变时,如果队首距离大于队尾,则交换首尾。
这个 S L F SLF SLF 看起来很弱,但却通过了所有 H a c k Hack Hack数据。而且,非常难卡。
U P D : UPD: UPD:不过这个希望又破灭了
H a c k e d    b y    n e g i i z h a    a n d    Hacked \,\,by \,\,negiizha\,\, and\,\, Hackedbynegiizhaand钟子谦。
H a c k Hack Hack: 与卡 SLF 类似,外挂诱导节点即可。
我枯了 关于 S P F A SPFA SPFA,它死了…

好了不说了 我现在就用这个优化去打遍天下了
这篇博客就到这儿了 如果知乎上把 S L F + s w a p SLF+swap SLF+swap H a c k Hack Hack了我会更新的
有问题可以写到下面的评论区 或者加 Q Q 407694747 QQ407694747 QQ407694747 我们一起讨论
各路神犇各位大佬请多多指教!

猜你喜欢

转载自blog.csdn.net/dhdhdhx/article/details/100828417