/*
kruskal 算法適用於簡單圖更好, 而prim更適合稠密圖
*/#include<iostream>#include<cstdio>#include<algorithm>
using namespace std;constint maxn =200005;int fat[maxn], n, m, val =0;struct node
{int from, to, dis;}edge[maxn];
bool cmp(node a, node b){return a.dis < b.dis;}voidinit(){for(int i =1; i <= n; i++){
fat[i]= i;// 先使自己爲自己的父親}}intfather(int x)//查找x的父親是誰{if(x != fat[x])returnfather(fat[x]);elsereturn x;}intun(int x,int y)//使x的父親爲y父親的父親{
fat[father(y)]=father(x);}intkruskal(){init();sort(edge+1, edge+1+m, cmp);// kruskal 的部分int k =0;for(int i =1; i<= m; i++){if(k == n-1)break;if(father(edge[i].from)!=father(edge[i].to))// 如果from 和 to 的父親不一樣 即 from和to不在一個集合裏{un(edge[i].from, edge[i].to);
val += edge[i].dis;
k++;}}printf("%d\n", val);}intmain(){scanf("%d %d",&n,&m);for(int i =1; i <= m; i++)scanf("%d %d %d",&edge[i].from,&edge[i].to,&edge[i].dis);kruskal();return0;}