本算法维护的是最小生成树的权值,
我们可以认为把一个图当做一个森林,然后每一个节点各自就构成了一个包含一个节点的树,
在任意时刻,都是将从剩余的边中找出一个权值最小的,并且这条边的两个节点属于不同的树。
1:建立并查集,各个点各自构成一个集合。
2:把所有的边按照权值的从小到大进行排序,然后一次扫描每一条边(x,y,z)。
3:x,y属于同一个集合,则忽略这条边,否则加入集合,并累加变得权值
4:扫描完所有的边之后,变得到了最小生成树。
#include<bits/stdc++.h>
using namespace std;
struct rec{
int x,y,z;
} edge[500010];
int fa[10010],n,m,ans;
bool operator<(rec a,rec b){
return a.z<b.z;
}
int get(int x)
{
if(x==fa[x])
return x;
return fa[x]=get(fa[x]);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);
sort(edge+1,edge+m+1);
for(int i=1;i<=m;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
{
int x=get(edge[i].x);
int y=get(edge[i].y);
if(x==y)
continue;
fa[x]=y;
ans+=edge[i].z;
}
cout<<ans<<endl;
return 0;
}