出了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[