最小生成树 (kruskal)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef long double ld;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define lowbit(x) x&-x
const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
const int maxm=100+10;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int r[maxn],f[maxn],n,m;
int u[maxn],v[maxn],d[maxn];
int find(int x) { return f[x]==x?x:find(f[x]);}
int cmp(int i,int j) { return d[i]<d[j]; }
int kruskal(){
int ans=0;
for(int i=0;i<n;i++) f[i]=i;
for(int i=0;i<m;i++) r[i]=i;
sort(r,r+m,cmp);
for(int i=0;i<m;i++)
{
int x=find(u[r[i]]);
int y=find(v[r[i]]);
if(x!=y) { ans+=d[r[i]]; f[x]=y; }
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++) scanf("%d%d%d",&u[i],&v[i],&d[i]);
printf("%d\n",kruskal());
}