• hdu 3018 Ant Trip


    并查集+欧拉回路

    对于每个连通的集合,如果该集合只有一个元素 那么不用管,如果该集合大于一个元素,那么求出奇度的个数,如果奇度个数是0,那么ans+1,否则ans+sum/2,sum为该集合内奇度的个数。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    const int maxn=100010;
    int father[maxn],summ[maxn],ff[maxn],tong[maxn];
    int n,m,i,u,v;
    vector<int>b;
    
    int findd(int x)
    {
        if(x!=father[x]) father[x]=findd(father[x]);
        return father[x];
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
        for(i=0;i<=n;i++) father[i]=i;
        memset(summ,0,sizeof(summ));
        memset(tong,0,sizeof(tong));
        memset(ff,0,sizeof(ff));
        b.clear();
    
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            int fu=findd(u);
            int fv=findd(v);
            summ[u]++;summ[v]++;
            if(fu!=fv) father[fu]=fv;
        }
    
        for(i=1;i<=n;i++)
        {
            int xx=findd(i);
            if(ff[xx]==0)
            {
                b.push_back(xx);
                ff[xx]=1;
            }
            if(summ[i]%2==1) tong[xx]++;
        }
        int anss=0;
        for(i=0;i<b.size();i++)
        {
            if(summ[b[i]]==0) continue;//这个集合只有一个点 忽略
            if(tong[b[i]]==0)//这个集合无奇度节点
                anss++;
            else anss=anss+tong[b[i]]/2;
        }
        printf("%d
    ",anss);
        }
        return 0;
    }
  • 相关阅读:
    现代软件工程 第一周博客作业
    最后一周总结
    阅读后感
    软件工程作业个人项目——csdn app分析
    第二次结对编程
    软件工程作业二
    软件工程作业一
    ASE 课程最后小结
    阅读后感
    Judy Beta 第五天
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4575715.html
Copyright © 2020-2023  润新知