Kruskal 求最小生成树

手写模板

算法思想:
将所有边按照边权从小到大排序,设置一个并查集,用来判断两个点是否在同一个联通块内。从小到大依次考虑所有边,如果该边的两点已经在同一个联通块内,则无需再添加此联通块,否则将该边加入图中,并更改并查集。

代码实现

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
struct edge{
    int x,y,w;
    edge(){
        x=0;y=0;w=0;
    }
    friend bool operator < (edge a,edge b){
        return a.w<b.w;
    }
};
int find(int u,int* F){
    if(F[u]!=u)
        return find(F[u],F);
    return u;
}
int main(){//Kruskal
    int n,m;    //n点数 m边数 
    cin>>n>>m;
    int F[n+5],ans=0;
    edge E[m+5];
    for(int i=0;i<m;i++)
        cin>>E[i].x>>E[i].y>>E[i].w;
    sort(E,E+m);
    for(int i=0;i<=n;i++)
        F[i]=i;
    for(int i=0;i<m;i++){
        if(find(E[i].x,F)!=find(E[i].y,F)){
            ans+=E[i].w;
            F[find(E[i].x,F)]=find(E[i].y,F);
        }
    }
    cout<<ans;
    return 0;
}

By YOUSIKI

你可能感兴趣的:(Kruskal 求最小生成树)