#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,aa,bb,cc,cur=0,p[1000100],k=0;
long long ans=0;
struct node{
int u,v,value;
}a[1000100];
int cmp(struct node aa,struct node bb){
return aa.value<bb.value;
}
int find(int i){
return p[i]==i?i:p[i]=find(p[i]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&aa,&bb,&cc);
a[cur].u=aa;
a[cur].v=bb;
a[cur].value=cc;
cur++;
}
sort(a,a+cur,cmp);
for(int i=1;i<=n;i++) p[i]=i;
for(int i=0;i<m;i++){
int uu=find(a[i].u);
int vv=find(a[i].v);
if(vv!=uu){
ans+=a[i].value;
p[uu]=vv;
}
}
printf("%lld",ans);//注意!!!!!long long 型用%lld输出!!!!!
return 0;
}
题解:基本也是一个裸的Kruskal算法,与CODEVS 1078 最小生成树不同的是,本题并不是所有的点都是可以连通的。但事实上,在编写程序时与CODEVS 1078 最小生成树并没有什么太大的区别,主要的不同点就是–我们在用a[]结构体构造图的时候只连接了可以连接的点,仅此而已。