Loading

Boruvka 简介

Boruvka 是一种最小生成树算法,用于求解稠密图的 MST。

【典题】CF Xor-MST:

发现边数是 $n^2$ 级别的,直接把 Kruskal 和 Prim ban 了,所以考虑使用 Boruvka 解决这个问题。

基本流程:

首先初始化每个连通块为自身,每次对于 $u\in S$ 找到满足题意的最小的边连到 $v\notin S$ 并把两个连通块合并。直到只剩下一个连通块,也就是整个图联通。

正确性证明:不会。

分析一下代码实现:

我们用并查集维护集合关系,我们在每次循环开头判断当前连通块个数。

int cnt = 0;
F(i,1,n){
    if(f[i]==i){
        bl[i] = cnt+1; cnt++;
        to[cnt]=val[cnt]=-1;
    }
}
if(cnt==1) break;

一般的,我们把 to[x]val[x] 记为从 x 这个连通块出发能到达的满足条件的最优和边权。

当然你也可以写成 cnt 在外面统计的形式,只不过这样写对于后面每个块处理有点麻烦,所以我不这么写。

我们考虑一下本题,怎么找“最优边”?异或最小,显然想到使用 01-Trie 维护,但是我们需要写的是支持删除的 01-Trie 所以需要额外记录 $size$。

复杂度是 Boruvka 的本身 $\mathcal{O}(n\log n)$ 乘上你需要额外支持快速查询最小边的数据结构的复杂度,在本题中为 $\mathcal{O}(\log V)$,$V$ 为值域。

总复杂度 $\mathcal{O}(n\log n \log V)$ 常数也较大,注意卡常。

只有一道例题的原因是我只会这一道,以前做过一道模版可惜找不到了,另外的题要么是可以用普通的 MST 算法过,要么是太抽象或太难的应用,笔者太菜不会。

posted @ 2024-01-19 12:28  紊莫  阅读(619)  评论(0)    收藏  举报  来源