#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct node{
int rank;
int father;
int count;
int degree;
}c[100000];
int a[200000],b[200000];
int n,m;
int find(int p)
{
while(p!=c[p].father) p=find(c[p].father);
return c[p].father;
}
void Union(int t1,int t2)
{
if(c[t1].rank>=c[t2].rank)
{
c[t2].father=t1;
if(c[t1].rank==c[t2].rank)
c[t1].rank++;
c[t1].count+=c[t2].count;
}
else
{
c[t1].father=t2;
c[t2].count+=c[t1].count;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
c[i].count=c[i].rank=c[i].degree=0;
c[i].father=i;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a[i],&b[i]);
c[a[i]].degree++;
c[b[i]].degree++;
}
for(int i=1;i<=n;i++)
{
if(c[i].degree%2)
c[i].count=1;
}
for(int i=1;i<=m;i++)
{
int aa=find(a[i]);
int bb=find(b[i]);
if(aa!=bb)
Union(aa,bb);
}
int count=0;
for(int i=1;i<=n;i++)
{
if(c[i].degree&&c[i].father==i)
{
if(c[i].count==0)
count++;
else
count+=c[i].count/2;
}
}
printf("%d\n",count);
}
return 0;
}
HDU 3018 Ant Trip(一笔画问题)
最新推荐文章于 2019-03-22 11:21:17 发布