【boruvka算法小记】
算法流程
一开始每个连通分量是一个点本身,每轮,每个连通分量选择和其他连通分量相连的最小的边,然后合并,可以证明最多log轮后,只会剩下一个连通分量,复杂度O(mlog n)
证明:
正确性是显然的,每个联通分量向外连出的最小的边,一定在最小生成树中。
然后考虑,每个连通分量选择和其他连通分量相连的最小的边,那么n个连通分量,连出n条边,这不就变成基环树森林了吗?可最小生成树不能出现环啊?其实,一定不会出现环的情况,考虑一个环如果存在的话说明环上的边是单调递减的,而这是不可能的。(当存在边权相等的边时,可以按照边的编号为第二关键字排序,即强制不存在相等的边)那么每轮过后,每个连通分量一定会至少与另外的一个连通分量合并,那么每轮连通块的个数至少减半,因此最多log轮后剩下一个连通分量。
应用
在稀疏图中,kruskal占优势
在稠密图中,prim占优势
而boruvka适用于边权有特殊性质的完全图中。
例如
- \((a_i+a_j)\%m\),
先把所有的\(a_i\)对m取模,那么当\(a_i+a_j\geq m\)时,\((a_i+a_j)\%m=a_i+a_j-m\),否则\((a_i+a_j)\%m=a_i+a_j\),对于第一种情况可以用set维护不在当前连通块的点,在上面二分找到最优解,第二种情况取set中最小的元素即可。那么每轮的复杂度是\(n\log n\),总复杂度\(O(n\log^2n)\) - \(a_i \oplus a_j\)
跟上个问题类似,用01trie维护即可,即将对一个连通块进行处理时,先把这个连通块的的点权在trie树中撤销掉,然后对于这个连通块中的每个点,在trie树中找到最优的点即可。每轮\(n\log V\),z总复杂度\(O(n\log V\log n)\)
但是其实有更简洁的做法,考虑直接把所有权值加到一个trie树里,然后dfs,从下往上每次合并一个点的左右儿子(如果存在的话),这样做的理由是,某个点左右儿子之间进行合并,一定比跟外面的权值合并要优(trie树的性质)。如果我们先从小到大对权值排个序,那么一颗子树中的权值在区间上是连续的一段,这样就方便统计答案了。复杂度大概\(O(n\log^2V)\)或\(O(n\log V\log n)\) - 平面图曼哈顿距离最大生成树
首先有个常见的套路,就是曼哈顿距离转切比雪夫距离,这里简单介绍一下:
首先切比雪夫距离的定义是,两个点横坐标差的绝对值和纵坐标差的绝对值的max
设两个点\((x_1,y_1),(x_2,y_2)\),则他们的曼哈顿距离\(dis=|x_1-x_2|+|y_1-y_2|\),
把绝对值拆开有四种情况: - \((x_1+y_1)-(x_2+y_2)\)
- \((x_1-y_1)-(x_2-y_2)\)
- \((x_2+y_2)-(x_1+y_1)\)
- \((x_2-y_2)-(x_1-y_1)\)
注意到,\(dis\)为这四种情况的max,因为绝对值是非负的,把任意一个绝对值取反,一定不如原先大。
而且1和3,2和4正好是一对相反数,因此可以把max写成绝对值的形式:
\(dis=max(|(x_1+y_1)-(x_2+y_2)|,(x_1-y_1)-(x_2-y_2))\)
我们发现这与切比雪夫距离的形式很相似,如果我们令\(x_1'=x_1+y_1\),\(y_1'=x_1-y_1\),\(x_2'=x_2+y_2\),\(y_2'=x_2-y_2\)
那么\(dis=max(|x_1'-x_2'|,|y_1'-y_2'|)\),这意味着如果我们把所有点的横坐标改为原来的横纵坐标之和,纵坐标改为原来的横纵坐标之差,那么原来任意两点的曼哈顿距离即为当前任意两点的切比雪夫距离。
然后再来看题目,那么我们实际上要求平面图切比雪夫距离最大生成树。
使用prim算法复杂度是\(O(N^2)\)的,注意到这相当于一个完全图求最小生成树,于是我们考虑boruvka算法:
每个点连向距离其最远的点,发现每个点一定会连向所有点中横纵坐标最大最小的四个点之一,那么经过一轮后只有可能剩下一个或两个连通块,如果剩下两个连通块的话,将这两个连通块连起来,一定是分别从这两个连通块中找到横纵坐标最小或最大的
四个点,选出一对最长的连起来。
发现在这个过程中我们只需找到横纵坐标最大最小的点,总复杂度O(N)
但是这个做法难以拓展到最小生成树的情况。