Boruvka 学习笔记
Boruvka 算法是一种求解最小生成树的算法。每轮对于每个连通块,找出一条连接其他连通块的最短边,并将这些边加入最小生成树中。由于每轮连通块数量减半,所以是 的。
连通块使用并查集维护。其实并查集是 还是 的没有影响,因为一共只会合并 次。
该算法常用于求解稠密图的最小生成树。
例题
P9701
定义特殊边为 中的边,平凡边为其他。特殊点为连接特殊边的点,平凡点为其他。
发现 非常大,而与特殊点只有 个,考虑将一段平凡点缩成一个,这样一段里相邻的两个连接一条长度为 的平凡边最优。缩完后就只有不超过 个点。
Boruvka 算法中需要枚举最小出边。枚举特殊边是 的,而枚举平凡边则不可接受。事实上我们不用枚举每一条平凡边,由于只求最小的那一条,所以对于点 往前后暴力跳就好了。
现在证明暴力跳的时间复杂度是对的。跳到 且不满足是平凡出边时会有两种情况。
- 是一条特殊边。由于特殊边只有 条,所以每轮 1 情况的总和是 的。
- 与 属于同一连通块。这时需要维护一个 prev/next 数组来跳过一整段同一连通块的,使得 1,2 两种情况是交替出现的,所以每轮 2 情况的总和也是 的。
CF1550F
考虑将 两点之间连一条边权 的边,表示两点可以一次到达当且仅当 跳跃距离范围设置 不小于 。
于是能否从 到达 就是判定 和 两点是否有一条路径满足所有边的边权不大于 。有一个经典的 trick 是两点之间最小的路径上的边权最大值等于两点在 MST 上的路径边权最大值。
使用 Boruvka 求解 MST。考虑怎么找到最小的 w 的 。分类讨论一下得:
分别找离 和 最近的就好了。
CF888G
看到异或想到 0-1 trie,发现在 trie 上 LCA 深度越大异或越小。考虑从根递归下去,对于有两个儿子的点,将两个儿子子树合并为一个连通块后,在 trie 上找到最小边合并即可。
本文作者:ASnown
本文链接:https://www.cnblogs.com/As-Snow/p/18495862
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步