Kruskal算法模板(并查集+快读

Toretto·2022-03-03 22:01·123 次阅读

Kruskal算法模板(并查集+快读

复制代码
#include<bits/stdc++.h>
using namespace std;
const int maxm=4e5+10;
const int maxn=2e5+10;
struct node{
    int u,v,w;
    bool operator < (const node & o) const{
        return w<o.w;
    }
} edge[maxm];
int fa[maxm],rk[maxm];

inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
void write(long long x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}

void Init(int n){
    for(int i=1;i<=n;i++){
        rk[i]=1;
        fa[i]=i;
    }
}
int find(int x){
    if(fa[x]!=x){
        fa[x]=find(fa[x]);
    }
    return fa[x];
}
void unite(int x,int y){
    x=find(x);
    y=find(y);
    if(x==y) return;
    if(rk[x]<rk[y]){
        fa[x]=y;
        rk[y]+=rk[x];
    }else{
        fa[y]=x;
        rk[x]+=rk[y];
    }
}

int Kruskal(int n,int m){
    int nEdge=0,length=0;
    for(int i=1;i<=m && nEdge!=m-1;i++){
        if(find(edge[i].u)==find(edge[i].v)){
            continue;
        }else{
            unite(edge[i].u,edge[i].v);
            length+=edge[i].w;
            nEdge++;
        }
    }
    if(nEdge<n-1) length=-1;
    return length;
}

int main(){
    int n,m;n=read();m=read();
    Init(n);
    for(int i=1;i<=m;i++){
        edge[i].u=read();
        edge[i].v=read();
        edge[i].w=read();
    }
    sort(edge+1,edge+m+1);
    write(Kruskal(n,m));
    putchar('\n');
    system("pause");
    return 0;
}
复制代码

 

posted @   云憩风霞  阅读(123)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示