HDU 3018 Ant Trip 欧拉路 并查集
开始的时候没有看清题 以为是每个联通图判断欧拉路就行了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;//hdu3018 对于联通的图判断奇数度数的个数 如果==0 就+1 就行了 否者 加奇数个数的1/2
#define maxn 100005
#define maxm 200005
int degree[maxn],pa[maxn],flag[maxn];
int n,m,x,y;
void init()
{
memset(degree,0,sizeof(degree));
memset(flag,0,sizeof(flag));
for(int i=1;i<=n;i++)
{
pa[i]=i;
}
}
int find(int x) {
return pa[x] == x ? x : pa[x] = find(pa[x]);
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return;
pa[x] = y;
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
init();
int count=0;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
degree[x]++;
degree[y]++;
unite(x,y);
}
for(int i=1;i<=n;i++)
{
if(degree[i]&1)
flag[find(i)]++;
}
for(int i=1;i<=n;i++)
{
if(find(i)==i &°ree[i])
{
if(flag[i]==0) count++;
else count+=flag[i]/2;
}
}
printf("%d\n",count);
}
}