题目链接:传送门
思路:
用并查集统计出每个区块奇数个节点的个数x,每个区块对笔画的贡献是max(x/2,1);
然后每个区块求和即可。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = *;
int du[maxn],num[maxn],fa[maxn];
int MAX(int x,int y)
{
return x>y?x:y;
}
int f(int x)
{
if(fa[x]==) return x;
else return fa[x]=f(fa[x]);
}
void Init()
{
memset(du,,sizeof(du));
memset(num,,sizeof(num));
memset(fa,,sizeof(fa));
}
int main(void)
{
int n,m,t1,t2,i,j,x,y;
while(~scanf("%d%d",&n,&m)){
Init();
for(i=;i<=m;i++){
scanf("%d%d",&x,&y);
du[x]++;du[y]++;
t1=f(x);t2=f(y);
if(t1!=t2) fa[t2]=t1;
}
for(i=;i<=n;i++)
if(du[i]%) num[f(i)]++; int cnt=;
for(i=;i<=n;i++)
if(fa[i]==&&du[i]) cnt+=MAX(,num[i]/);
printf("%d\n",cnt);
}
return ;
}