0-1 bfs 的一点扩展
可以扩展到 a-b bfs。
开两个队列,经过 \(a\) 的点放一个,经过 \(b\) 的点放另一个,每次从头取出最小的转移即可。
可以进一步扩展到 \(a_1-a_2-a_3-\dots\) bfs,有几种边权就开几个队列。
upd on 2025.11.05:
因为被推荐到了知识点征集速报第一期中,所以稍微加一点解释。
大家都知道 0-1 bfs,处理只有 0 和 1 边权的图的最短路问题时可以使用一个双端队列,经过 0 的边之后继续放入队首,经过 1 的边之后放入队尾,始终保持队列是有序的。
然而这自然的拓展到更多的问题,比如 1-2 bfs,即边权只有 1 和 2,沿用上面的方法不能保证队列中有序,于是可以开两个队列,保证每个队列分别有序,查找最小值也只需要从其中的队头比较一下即可。
如此看来,只要边权只有 \(O(1)\) 种(非负),就可以用类似的方法维护,进一步地,可以将其他 \(O(1)\) 种转移也用类似的思想维护,比如 [NOIP 2016 提高组] 蚯蚓。

浙公网安备 33010602011771号