Boruvka算法 ——最小生成树

Boruvka算法是一种求解最小生成树的方法,尤其适用于点数较大且连边满足特定条件的完全图。算法核心是每次选择每个联通块到其他块的最小子边,逐步连接联通块,直至所有点联通。由于每次操作至少减少一半联通块,循环复杂度为O(mlogn),其中m为边的数量。正确性的证明类似于Kruskal算法。
摘要由CSDN通过智能技术生成

出了K和P算法以外 还有一种B算法 求MST;

核心思想:如果仅剩两个联通块,那么MST的最后一个边。一定是连接这两个联通块的所有边中边权最小的边。

大体思路是:

首先所有点都设成一个联通块

1.遍历所有联通块,找出该联通块的点连向其他联通快的边,边权最小的一个;

2.MST一定选中这条边,连接联通块。

重复1.2操作知道联通块只剩一个,即所有点联通,连出了一个MST。

由于一次操作至少会减少一般操作。所以上述循环只会重复logn次。每次的复杂度mlogn

通常在给你一个完全图,点数很大,连边满足某种条件时。

我们能快速找到某个点连的最小边,就能用B算法快速处理

 

算法正确性?  跟kruskal证明一样。。

#include<bits/stdc++.h>
using namespace std;
const int M =4e5+7;
const int N =5050;
struct node
{
	int nxt,w,to;
}ee[M];
int head[M],cnt;
void add(int u,int v,int w)
{
	ee[++cnt].to=v;
	ee[cnt].w=w;
	ee[cnt].nxt=head[u];
	head[u]=cnt;
}
int fa[N],siz[N];
int get(int x)
{
	if(x==fa[x])return x;
	return fa[x]=get(fa[x]);
}
void merge(int x,int y)
{
	int gx=get(x),gy=get(y);
	if(siz[gx]>siz[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值