kruskal算法

const int maxn=28;
struct Edge{
    int u,v,w;
    bool operator <(const Edge &rhs) const{
        return w<rhs.w;
    }
}edges[maxn*maxn];
int f[maxn];

void init(int N){
    for(int i=1;i<=N;i++)
        f[i]=i;
}

int findfa(int a){
    if(f[a]!=a)
        f[a]=findfa(f[a]);
    return f[a];
}

void unit(int a,int b){
    int fa=findfa(f[a]);
    int fb=findfa(f[b]);

    if(fa!=fb)
        f[fa]=f[fb];
}

int m=0;
void addEdge(int u,int v,int w){
    edges[m].u=u;
    edges[m].v=v;
    edges[m].w=w;
    m++;
}

int  prime(int N){
    init(N);

    sort(edges,edges+m);

    int ans=0;
    int cnt=0;
    for(int i=0;i<m;i++){
        if(findfa(edges[i].u)!=findfa(edges[i].v)){
            ans+=edges[i].w;
            unit(edges[i].u,edges[i].v);
            cnt++;
        }
        if(cnt==N-1)
            break;
    }
    if(cnt!=N-1)  //这不是联通图
        ans=-1;
    return ans;
}
原文地址:https://www.cnblogs.com/IKnowYou0/p/6657445.html