#include<iostream>
#include<algorithm>
using namespace std;
int n,m,f[1000000],sum,c;
struct date {
int to,from,w;
} e[2000100];
bool cmp(date x,date y) {
return x.w<y.w;
}
int find(int x) {
if(f[x]!=x)
f[x]=find(f[x]);
return f[x];
}//找共同祖先
int main() {
cin>>n>>m;
for(int i=1; i<=m; i++)
//将节点与节点与距离存入结构
cin>>e[i].from>>e[i].to>>e[i].w;
sort(e+1,e+1+m,cmp);
for(int i=1; i<=n; i++) //初始化
f[i]=i;
for(int i=1; i<=m; i++) {
int a=e[i].from,b=e[i].to;
if(find(a)==find(b))
continue;//因为两节点联通就不需要记录长度
f[find(b)]=find(a);//将二者连接
c+=e[i].w;
sum++;
if(sum==n-1) {结束条件就是边数为节点数-1
cout<<c;
}
}
}
第一行包含两个整数 N,M,表示该图共有 N个结点和 M 条无向边。 一下M行为节点之间的连接与长度。
确保改图联通的情况下,输出最小树各边长度之和。
先把节点之间的长度进行排序,用贪心的思想优先选取长度较小的边,并依次累加,若存在共同祖先(就是成环)则跳过此边(用并查集来判断)。