struct edge{
int u,v,cost;
}es[maxn_e];
bool cmp(const edge &a,const edge &b){
return a.cost<b.cost;
}
int par[maxn_n],rankk[maxn_n];
void init_union_find(int n){
for(int i=0;i<=n;i++){
par[i]=i;
rankk[i]=0;
}
}
int findfather(int x){
if(par[x]==x)return x;
else {
return par[x]=findfather(par[x]);
}
}
void unit(int x,int y){
x=findfather(x);
y=findfather(y);
if(x==y)return;
if(rankk[x]<rankk[y]){
par[x]=y;
}
else{
par[y]=x;
if(rankk[x]==rankk[y])rankk[x]++;
}
}
bool same(int x,int y){
return findfather(x)==findfather(y);
}
int n,m;
int kruskal(){
sort(es,es+m,cmp);
init_union_find(n);
int res=0;
for(int i=0;i<m;i++){
edge e=es[i];
if(!same(e.u,e.v)){
unite(e.u,e.v);
res+=e.cost;
}
}
return res;
}
最小生成树模板
最新推荐文章于 2025-03-04 15:20:31 发布