$Boruvka$ 算法求解最小生成树.
有一张 $n$ 个点的完全图,其中第 $i$ 个点有一个权值 $a_i$ ,两个点 $i,j$ 之间的边权为 $a_i\oplus a_j$ .
需要求出这张完全图的最小生成树的权值.
$n\le 2\times 10^5,0\le a_i<2^{30}$ .
利用 $Boruvka$ 算法求解.
- 这个算法需要进行若干轮,初始时每个点是一个独立的连通块.
- 每一轮中,对于每个连通块,找到边权 $w$ 最小的边 $e=(u,v,w)$ ,满足 $u$ 在该块内,而 $v$ 不在该块内.
- 将这些边都加入图中,利用并查集维护连通性.
- 当加入了 $n-1$ 条边后,就得到了一棵最小生成树.
- 每轮暴力枚举每条边,而每做一轮,连通块数目至少减少为原来的一半,所以时间复杂度为 $O((m+n)\log n)$ .
这个算法的瓶颈在于对于每个连通块找出连出去的边中,边权最小的那条边.
可以利用 $Trie$ 树优化这个找边过程,时间复杂度优化到 $O(n\log a\log n)$ .
这类套路题大概是每个点有点权,任意两点之间的边权由二者的点权决定,需要求最小生成树.
做法大致都和这道题类似,尝试去优化找最优边的过程.
1 | //%std |