【hdu4018】Ant Trip 欧拉图

来源:互联网 发布:中信建投证券软件 编辑:程序博客网 时间:2024/06/13 02:15

Ant Trip

TimeLimit: 2000/1000 MS (Java/Others)    Memory Limit:32768/32768 K (Java/Others)
Total Submission(s): 3433    Accepted Submission(s): 1362

ProblemDescription

Ant Country consist of N towns.There areM roads connecting the towns.

Ant Tony,together with his friends,wants to go through every part of thecountry.

They intend to visit every road , and every road must be visited for exact onetime.However,it may be a mission impossible for only one group of people.Sothey are trying to divide all the people into several groups,and each may startat different town.Now tony wants to know what is the least groups of ants thatneeds to form to achieve their goal.

 

 

Input

Input contains multiple cases.Test casesare separated by several blank lines. Each test case starts with two integerN(1<=N<=100000),M(0<=M<=200000),indicating that there are N townsand M roads in Ant Country.Followed by M lines,each line contains two integersa,b,(1<=a,b<=N) indicating that there is a road connecting town a andtown b.No two roads will be the same,and there is no road connecting the sametown.

 

 

Output

For each test case ,output the leastgroups that needs to form to achieve their goal.

 

 

SampleInput

3 3

1 2

2 3

1 3

 

4 2

1 2

3 4

 

 

SampleOutput

1

2

 

Hint

New ~~~ Notice: if there are no roadconnecting one town ,tony may forget about the town.

In sample 1,tony and his friends justform one group,they can start at either town 1,2,or 3.

In sample 2,tony and his friends mustform two group.

 


这是一个关于一笔画的问题,先用并查集维护看看有几个联通块,再统计联通块中奇点的个数,奇点为0就可以一笔画成,否则就要用奇点数/2笔画成(因为每两个奇点之间需要画一笔)

#include<iostream>#include<cstdio>#include<cstring>#define N 100050using namespace std;int n,m,tot,ans;int res[N],fa[N],ji[N],du[N],visit[N];int getfa(int x){return fa[x] == x?x:fa[x]=getfa(fa[x]);}inline int read(){    int ret=0;char ch=getchar();    while(ch<'0' || ch>'9') ch=getchar();    while(ch>='0' && ch<='9') ret=ret*10+ch-'0',ch=getchar();    return ret;}inline void inti(){        tot=0;ans=0;        for (int i=1;i<=N;i++)        {            du[i]=0;visit[i]=0;            res[i]=0;ji[i]=0;        }        for (int i=1;i<=n;i++) fa[i]=i;}int main(){    while(scanf("%d%d",&n,&m) != EOF)    {        inti();        for (int i=0;i<m;i++)        {            int x,y;            x=read();y=read();            int p=getfa(x),q=getfa(y);            if (p != q) fa[p]=q;            du[x]++;du[y]++;        }        for (int i=1;i<=n;i++)        {            int ba=getfa(i);            if (!visit[ba]) visit[ba]=1,res[tot++]=ba;            if (du[i]&1) ji[ba]++;        }        for (int i=0;i<tot;i++)        {            if (!du[res[i]]) continue;            if (!ji[res[i]]) ans++;            else ans+=ji[res[i]]/2;        }        printf("%d\n",ans);    }    return 0;}