zoukankan      html  css  js  c++  java
  • hdu 3367 Pseudoforest(最大生成树)

    /*  可以说是一个最大生成树的问题吧,

        题意:求出一个最大的子图(子图的每个连通分量最多有一个环)

       用kruskal算法求出最大生成树  不过要判断是否有环  2树合并时 :若2个子树都有环不能合并 只有一个有环可以合并 但合并后的树有环 若2个子树都没环直接合并

    */

    #include<cstdio>

    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m;
    struct Edge
    {
        int u,v,d;
        bool operator < (const Edge &s) const
        {
            return d>s.d;
        }
    }a[100010];
    int p[10010],vis[10010];
    int find(int x)
    {
        return p[x]==x?x:p[x]=find(p[x]);
    }
    int Union(int x,int y)
    {
        if(x==y) return 0;
        p[x] = y;
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)==2)
        {
            if(!n&&!m) break;
            memset(vis,0,sizeof(vis));
            for(int i = 0; i <= n; i++) p[i]=i;
            for(int i = 0; i < m; i++)
            scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].d);
            sort(a,a+m);
            long long ans=0;
            for(int i = 0; i < m; i++)
            {
                int x = find(a[i].u);
                int y = find(a[i].v);
                if(x!=y)
                {
                    if(vis[x]&&vis[y]) continue;
                    if(vis[x]||vis[y])
                    vis[x]=vis[y]=1;
                    ans+=a[i].d;
                    Union(x,y);
                }
                else if(!vis[x])
                {
                    vis[x] = 1;
                    ans+=a[i].d;
                    Union(x,y);
                }
            }
            printf("%lld\n",ans);
        }
        return 0;
    }

  • 相关阅读:
    BZOJ3631: [JLOI2014]松鼠的新家
    网络流24题题目总会+题解
    BZOJ3930: [CQOI2015]选数
    BZOJ4816: [Sdoi2017]数字表格
    Launcher类源码分析
    平台特定的启动类加载器深入分析与自定义系统类加载器详解
    类加载器命名空间总结与扩展类加载器要点分析
    类加载器命名空间深度解析与实例分析
    类加载器实战剖析与疑难点解析
    类加载器命名空间实战剖析与透彻理解
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3036418.html
Copyright © 2011-2022 走看看