加边 贪心
详解看这
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,tot=0,k=0;
int fat[200010];
struct node{
int from,to,dis;
}edge[200010];
bool cmp(const node&a,const node&b)
{
return a.dis<b.dis;
}
int father(int x)
{
if(fat[x]!=x)
return father(fat[x]);
return x;
}
void unionn(int x,int y)
{
fat[father(y)]=father(x);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>edge[i].from>>edge[i].to>>edge[i].dis;
for(int i=1;i<=n;i++) fat[i]=i;
sort(edge+1,edge+n+1,cmp);
for(int i=1;i<=m;i++)
{
if(k==n-1) break;
if(father(edge[i].from)!=father(edge[i].to))
{
unionn(edge[i].from,edge[i].to);
tot+=edge[i].dis;
k++;
}
}
cout<<tot;
return 0l
}