【boruvka算法小记】

算法流程

一开始每个连通分量是一个点本身,每轮,每个连通分量选择和其他连通分量相连的最小的边,然后合并,可以证明最多log轮后,只会剩下一个连通分量,复杂度O(mlog n)
证明:
正确性是显然的,每个联通分量向外连出的最小的边,一定在最小生成树中。
然后考虑,每个连通分量选择和其他连通分量相连的最小的边,那么n个连通分量,连出n条边,这不就变成基环树森林了吗?可最小生成树不能出现环啊?其实,一定不会出现环的情况,考虑一个环如果存在的话说明环上的边是单调递减的,而这是不可能的。(当存在边权相等的边时,可以按照边的编号为第二关键字排序,即强制不存在相等的边)那么每轮过后,每个连通分量一定会至少与另外的一个连通分量合并,那么每轮连通块的个数至少减半,因此最多log轮后剩下一个连通分量。

应用

在稀疏图中,kruskal占优势
在稠密图中,prim占优势
而boruvka适用于边权有特殊性质的完全图中。
例如

  1. (ai+aj)%m,
    先把所有的ai对m取模,那么当ai+ajm时,(ai+aj)%m=ai+ajm,否则(ai+aj)%m=ai+aj,对于第一种情况可以用set维护不在当前连通块的点,在上面二分找到最优解,第二种情况取set中最小的元素即可。那么每轮的复杂度是nlogn,总复杂度O(nlog2n)
  2. aiaj
    跟上个问题类似,用01trie维护即可,即将对一个连通块进行处理时,先把这个连通块的的点权在trie树中撤销掉,然后对于这个连通块中的每个点,在trie树中找到最优的点即可。每轮nlogV,z总复杂度O(nlogVlogn)
    但是其实有更简洁的做法,考虑直接把所有权值加到一个trie树里,然后dfs,从下往上每次合并一个点的左右儿子(如果存在的话),这样做的理由是,某个点左右儿子之间进行合并,一定比跟外面的权值合并要优(trie树的性质)。如果我们先从小到大对权值排个序,那么一颗子树中的权值在区间上是连续的一段,这样就方便统计答案了。复杂度大概O(nlog2V)O(nlogVlogn)
  3. 平面图曼哈顿距离最大生成树
    首先有个常见的套路,就是曼哈顿距离转切比雪夫距离,这里简单介绍一下:
    首先切比雪夫距离的定义是,两个点横坐标差的绝对值和纵坐标差的绝对值的max
    设两个点(x1,y1),(x2,y2),则他们的曼哈顿距离dis=|x1x2|+|y1y2|,
    把绝对值拆开有四种情况:
  4. (x1+y1)(x2+y2)
  5. (x1y1)(x2y2)
  6. (x2+y2)(x1+y1)
  7. (x2y2)(x1y1)
    注意到,dis为这四种情况的max,因为绝对值是非负的,把任意一个绝对值取反,一定不如原先大。
    而且1和3,2和4正好是一对相反数,因此可以把max写成绝对值的形式:
    dis=max(|(x1+y1)(x2+y2)|,(x1y1)(x2y2))
    我们发现这与切比雪夫距离的形式很相似,如果我们令x1=x1+y1,y1=x1y1,x2=x2+y2,y2=x2y2
    那么dis=max(|x1x2|,|y1y2|),这意味着如果我们把所有点的横坐标改为原来的横纵坐标之和,纵坐标改为原来的横纵坐标之差,那么原来任意两点的曼哈顿距离即为当前任意两点的切比雪夫距离。
    然后再来看题目,那么我们实际上要求平面图切比雪夫距离最大生成树。
    使用prim算法复杂度是O(N2)的,注意到这相当于一个完全图求最小生成树,于是我们考虑boruvka算法:
    每个点连向距离其最远的点,发现每个点一定会连向所有点中横纵坐标最大最小的四个点之一,那么经过一轮后只有可能剩下一个或两个连通块,如果剩下两个连通块的话,将这两个连通块连起来,一定是分别从这两个连通块中找到横纵坐标最小或最大的
    四个点,选出一对最长的连起来。
    发现在这个过程中我们只需找到横纵坐标最大最小的点,总复杂度O(N)
    但是这个做法难以拓展到最小生成树的情况。
posted @   glq_C  阅读(322)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示