51 nod 1212 无向图最小生成树

http://www.51nod.com/Challenge/Problem.html#problemId=1212

代码

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define ll long long
const int maxn=5e4+10;
int par[maxn];
int rank1[maxn];

void f(int n) //初始化 
{
    for(int i=0;i<n;i++)
    {
        par[i]=i;
        rank1[i]=0;
     } 
}
int find(int x)
{
    if(par[x]==x)
    {
        return x;
    }
    else
    {
        return par[x]=find(par[x]);
    }
}
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)
    return ;
    if(rank1[x]<rank1[y])
    {
        par[x]=y;
    }
    else
    {
        par[y]=x;
    }
    if(rank1[x]==rank1[y])
    rank1[x]++;
}
int n,m;
struct edge{
    int x,y,cost;
}e[50005];
bool cmp(const edge e1,const edge e2)
{
    return e1.cost<e2.cost;
}
int main()
{
    cin>>n>>m;
    f(n);
    for(int i=1;i<=m;i++)
    {
        cin>>e[i].x>>e[i].y>>e[i].cost;
    }
     ll res=0;
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<m;i++)
    {
        edge e1=e[i];
        if(find(e1.x)!=find(e1.y))
        {
            unite(e1.x,e1.y);        
            res=res+e1.cost;
        }
    }
    cout<<res<<"\n";
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/hh13579/p/11248955.html