题意:n个点,m条边。最少画几笔
题解:算算度数,并查集随便搞一搞就出来了
#include <bits/stdc++.h> using namespace std; const int N=100005; int f[N]; bool isfa[N];//是否是父亲 int n,ans; int in[2*N];//度数 int odd[N];//奇数结点 int findfa(int a) { return f[a]==a?a:f[a]=findfa(f[a]); } void merge(int a,int b) { int t1,t2; t1=findfa(a); t2=findfa(b); if(t1!=t2) f[t2]=t1; } void init() { memset(in,0,sizeof(in)); memset(odd,0,sizeof(odd)); memset(isfa,false,sizeof(isfa)); for(int i=0;i<=N;i++) { f[i]=i; } ans=0; } int main() { int m; while(~scanf("%d %d",&n,&m)) { init(); for(int i=0;i<m;i++) { int a,b; scanf("%d %d",&a,&b); in[a]++; in[b]++; merge(a,b);//初始化 } for(int i=1;i<=n;i++) { int fa=findfa(i); if(!isfa[fa]) { isfa[fa]=1; } if(in[i]%2==1) { odd[fa]++; } } for(int i=1;i<=n;i++) { //联通图 if(isfa[i]&&in[i])//in[i]==0 孤立点忽略 { if(odd[i]==0)//欧拉回路 奇数度点0一笔画 { ans++; } else { ans+=odd[i]/2;//不是欧拉回路 //有2k个奇数点,需要画k笔 } } } printf("%d\n",ans); } return 0; }