思路
从所给的图中,开始挑边,找到最小的权值边加入到树中,如果加入后成环,也就是这条新加边的两个端点本来就联通,那么就不选,选下一条,时间复杂度mlog(m)
模板
#include<iostream>
#include<algorithm>
#define Maxn 300100
using namespace std;
struct node
{
int a,b;
int qz;
};
int f[Maxn];
bool cmp(node a,node b)
{
return a.qz<b.qz;
}
int ff(int x)
{
while(x!=f[x])
x=f[x];
return x;
}
int n,m;
node edge[Maxn];
int kru()
{
int cnt=0;
int sum=0;
for(int i=1;i<=m;i++)
{
int fx=ff(edge[i].a);
int fy=ff(edge[i].b);
if(fx==fy)
continue;
f[fx]=fy;
sum+=edge[i].qz;
cnt++;
if(cnt==n-1)
break;
}
if(cnt<n-1)
return -1;
return sum;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&edge[i].a,&edge[i].b,&edge[i].qz);
sort(edge+1,edge+m+1,cmp);
int res=kru();
cout<<res<<endl;
// for(int i=0;i<v.size();i++)
// cout<<edge[v[i]].a<<' '<<edge[v[i]].b<<' '<<edge[v[i]].qz<<endl;
}