zoukankan      html  css  js  c++  java
  • 最小生成树(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;
    }
  • 相关阅读:
    用VS Code写C++程序如何运行
    DRF
    DRF
    DRF
    DRF
    DRF
    DRF
    DRF
    DRF
    DRF
  • 原文地址:https://www.cnblogs.com/mxrmxr/p/9846129.html
Copyright © 2011-2022 走看看