Boruvka 简介

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

【典题】CF Xor-MST:

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

基本流程:

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

正确性证明:不会。

分析一下代码实现:

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

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 的本身 O(nlogn) 乘上你需要额外支持快速查询最小边的数据结构的复杂度,在本题中为 O(logV)V 为值域。

总复杂度 O(nlognlogV) 常数也较大,注意卡常。

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

作者:紊莫

出处:https://www.cnblogs.com/wenmoor/p/17980903

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   紊莫  阅读(516)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题