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