在一个无向图中,链接每一条边都有相应的权值,如何链接这一些边,让这一个图成为一个连通图,而且让权值之和最小。
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#define sort std::sort
const int MAXN=20100;
struct Tedge
{
int len,u,v;
Tedge()
{
len=u=v=0;
}
}a[MAXN];//记录每一条边
int n,m;
int fa[MAXN];
int ans;
bool _cmp(Tedge a,Tedge b)
{
return a.len < b.len;
}
int _find(int root)//并查集查询是否在同一环
{
if(fa[root] == root) return root;
else return fa[root]=_find( fa[root] );//压缩路径
}
void _Kruskal()
{
sort(a,a+m,_cmp);
int k=0,sum=0;
for(int i=0;i<m;i++)
{
int dx=_find(a[i].u),dy=_find(a[i].v);
if(dx != dy)//如果不会形成环
{
k++;
sum+=a[i].len;
fa[dx]=dy;//选择这一条边,并且合并
}
if(k == n-1)//当选择了n-1条边时,就退出
{
ans=sum;
break;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].len);
for(int i=1;i<=n;i++) fa[i]=i;//初始化并查集
_Kruskal();
printf("%d\n",ans);
return 0;
}