思想:
将图中的边按照权值的大小排序,存在数组里。依次取出后,用并查集将边的另一个点打上标记。到所有点都打上标记后,结束。
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
int tot=0;
int vis[maxn],fa[maxn];
struct node{
int u,v,w;
};
node edge[maxn];
bool cmp(node x,node y){
return x.w<y.w;
}
int find(int x){
if(fa[x]==x) return x;
fa[x]=find(fa[x]);
return fa[x];
}
void merge(int x,int y){
int a=find(x),b=find(y);
fa[b]=a;
}
int main(){
freopen("temp.in","r",stdin);
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
edge[++tot].u=x;edge[tot].v=y;edge[tot].w=z;
edge[++tot].u=y;edge[tot].v=x;edge[tot].w=z;
}
for(int i=1;i<=n;i++)fa[i]=i;
sort(edge,edge+tot+1,cmp);
int k=1,ans=0;
for(int i=1;i<n;i++){
while(find(edge[k].u)==find(edge[k].v))k++;
ans+=edge[k].w;
merge(edge[k].u,edge[k].v);
}
printf("%d\n",&ans);
return 0;
}