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