最小生成树(kruscal算法)

其实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;
}

猜你喜欢

转载自www.cnblogs.com/mxrmxr/p/9846129.html