hdu3018 Ant Trip 欧拉回路

题意是几笔可以画完所给的图,其中没有与其他点连同的不需要考虑。

先用并查集将点分成不同的集合,由于题目是问几笔,所以不用考虑连通性。只需要考虑不同集合根节点中记录的这个集合奇度节点的个数,如果是零,最后答案加一,反之加上除二后的结果。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=150000+5;

int n,m,p[N],ans,in[N],odd[N],even[N];

int Find(int x)
{
    if(p[x]==x) return x;
    else return p[x]=Find(p[x]);
}

void Union(int a,int b)
{
    int f1=Find(a),f2=Find(b);
    if(f1!=f2) p[f1]=f2;
}

int main()
{
    int i,j,u,v;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=0;i<n;i++)
        {
            p[i]=i;
            in[i]=0;
            odd[i]=0;
            even[i]=0;
        }

        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            u--;
            v--;
            Union(u,v);
            in[u]++;
            in[v]++;
        }
        for(i=0;i<n;i++)
        {
            int f=Find(i);
            if(in[i]==0) continue;

            if(in[i]%2==0) even[f]++;
            else odd[f]++;
        }
        ans=0;
        for(i=0;i<n;i++)
        {
            if(p[i]!=i||!in) continue;
            if(odd[i]==0&&even[i]==0) continue;
            else if(odd[i]==0) ans++;
            else ans+=odd[i]/2;
        }
        printf("%d
",ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

原文地址:https://www.cnblogs.com/xryz/p/4847868.html