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);
}
}