牛客网小白月赛6H(最小生成树【克鲁斯卡尔】)

#include<bits/stdc++.h>
using namespace std;
long long sum=0;
struct node
{
    int a,b,len;
}road[500010];
int pre[500010];
bool cmp(node a,node b)
{
    return a.len<b.len;
}
int fin(int x)
{
    if(x!=pre[x])
    {
        pre[x]=fin(pre[x]);
    }
    return pre[x];
}
void connect(int x,int y,int n)
{
    int fx=fin(x),fy=fin(y);
    if(fx!=fy)
    {
        pre[fx]=fy;
        sum+=road[n].len;
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&road[i].a,&road[i].b,&road[i].len);
    }
    for(int i=1;i<=m;i++)
        pre[i]=i;
    sort(road+1,road+1+m,cmp);
    for(int i=1;i<=m;i++)
    {
        connect(road[i].a,road[i].b,i);
    }
    printf("%lld",sum);
    return 0;
}
posted @ 2018-08-19 20:41  sewage  阅读(208)  评论(0编辑  收藏  举报