HDU-3018几笔画问题

题目大意:问由几条道路组成的图需要几笔画完成;
解题思路:如果图是一条链或欧拉回路只需一笔画,但如果不连通,分为几个小子图,怎么解决??每个子图中的嫉妒点数除以2,然后把所有子图的奇度点数除以2,加起来就是总共需要几笔画;
 
 
#include<iostream>
#include<cstring>
using namespace std;
#define MAX 100001
int father[MAX],node[MAX],flag[MAX];
int n;
int find(int t)//并查集
{
    if(father[t]!=t)
        father[t]=find(father[t]);
    return father[t];
}
void work()
{
    int x;
    for(int i=1;i<=n;i++)
    {
        x=find(i);//记录父节点,一个父节点大祖先就是一个子图,如果只有一个,即为连通图
        if(flag[x]==-1&&node[i])//如果父节点没有调用过并且有入度点,初始化为0
            flag[x]=0;
            if(node[i]%2==1)//记录奇度点数
                flag[x]++;
    }
}
int main()
{
    int m,i,sum,a,b;
    while(cin>>n>>m)
    {
        memset(node,0,sizeof(node));
        memset(flag,-1,sizeof(flag));
        sum=0;
        for( i=1;i<=n;i++)
            father[i]=i;
        while(m--)
        {
            cin>>a>>b;
            node[a]++;node[b]++;//路是双向的
            father[find(a)]=find(b);

        }
        work();
        for(i=1;i<=n;i++)
        {
            if(flag[i]!=-1)
            {
                if(flag[i]==0)//为0则表示没有奇度点,一笔画就能完成
                    sum++;
                else
                    sum+=flag[i]/2;//奇度点除以2即为需要几笔画完成
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

你可能感兴趣的:(HDU-3018几笔画问题)