其实kruscal算法很简单,把边从小到大排一遍,如果加入此边形成环,就不加,知道这棵树有n-1条边。
代码如下(一定要理解):
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=;
struct edge{int x,y,z;}a[maxn];
int n,m,prt[maxn],ans=,bj;
bool cmp(const edge&x,const edge&y){return x.z<y.z;}
int father(int x)
{
if(prt[x]==x) return x;
prt[x]=father(prt[x]);
return prt[x];
}
void kru()
{
int f1,f2,k,i;
k=;
for(int i=;i<=n;i++) prt[i]=i;
for(int i=;i<=m;i++)
{
f1=father(a[i].x);
f2=father(a[i].y);
if(f1!=f2)
{
ans=ans+a[i].z;
prt[f1]=f2;
k++;
if(k==n-) break;
}
}
if(k<n-)
{
cout<<"-1"<<endl;
bj=;
return;
}
}
int main()
{
cin>>n>>m;
ans=-;
bj=;
for(int i=;i<=m;i++)
cin>>a[i].x>>a[i].y>>a[i].z;
sort(a+,a+m+,cmp);
kru();
if(bj) cout<<ans<<endl;
return ;
}