最小生成树

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=10000;
struct edge
{
    int u,v,cost;
}es[maxn];
bool cmp(edge e1,edge e2)
{
    return e1.cost<e2.cost;
}
int par[maxn],rank[maxn];
void init(int n)
{
    for(int i=0; i<=n; i++)
    {
        rank[i]=0;
        par[i]=i;
    }
}
int find(int i)
{
    if(i==par[i])
        return i;
    return par[i]=find(par[i]);
}
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)
        return ;
    if(rank[x]<rank[y])
        par[x]=y;
    else
    {
        par[y]=x;
        if(rank[x]==rank[y])
            rank[x]++;
    }
}
bool same(int x,int y)
{
    return find(x)==find(y);
}
int V,E;

int kruskal()
{
    sort(es,es+E,cmp);
    init(V);
    int res=0;
    for(int i=0; i<E; i++)
    {
        edge e=es[i];
        if(!same(e.u,e.v))
        {
            unite(e.u,e.v);
            res+=e.cost;
        }
    }
    return res;
}
int main()
{
    while(cin>>V>>E)
    {
        for(int i=0;i<E;i++)
        {
            cin>>es[i].u>>es[i].v>>es[i].cost;
        }
        cout<<kruskal()<<endl;
    }
    return 0;
}

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