Boruvka算法

Boruvka算法是一种用于求解最小生成树的算法,尤其适用于处理点权和边权相关的问题。它通过维护连通块,并寻找与每个连通块相连的边权最小的边来逐步构建最小生成树。虽然其平均时间复杂度较高,但在特定类型的题目中,如Atcoder keyence2019 E,可以达到O(n log^2 n)的复杂度,表现出较高的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Boruvka算法解决某些问题超级好用。

这些问题形如,给你n个点,每个点有点权,任意两个点之间有边权,边权为两个点权用过某种计算方式得出。

求最小生成树。

通常用O(log n)的时间可以找到与点i连边的边权最小的j。

我们考虑这样一个求最小生成树的算法:

考虑维护当前的连通块(初始每个点为独立的一个连通块)

对每个连通块,找到一条与该连通块相连的,且另一端点不在此连通块中的边权最小的边。

将所有的这些边都加入最小生成树,注意,当加入一条边时需判断该边的两端点是否在同一连通块。

重复若干遍上述操作,直到图连通。

这个算法叫Boruvka算法。

复杂度分析:每次连通块个数至少减半,则复杂度为O((n+m)logn),还有个并查集假装是O(1)

但是此算法通常不用于求裸的最小生成树(Kruskal多好用)

可是在解决上述问题时,往往有奇效。

我们发现,我们只需要求出与每个连通块相连的边权最小的边即可,在这种类型的题目中,这个东西复杂度一般为O(n log n)

所以我们就可以在O(n log^2 n)的复杂度下解决此类问题。

Atcoder keyence2019 E

#include <cstdio>
#include <iostream>
#include <cstring>
#define MN 201000

typedef long long ll;
int fa[MN];
int c1[MN], c2[MN];
int Min[MN];
ll D; int a[MN];
int X[MN], Y[MN];
int x[MN], y[MN];
ll ans = 0;
int bl;
int n;

int Abs(int a) {
   
   return a > 0 ? a : -a;}
ll F(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值