九野的博客,转载请注明出处: http://blog.csdn.net/acmmmm/article/details/10858065
题意:n个点m条边的无向图,求用几笔可以把所有边画完(画过的边不再画)
思路:
并查集+欧拉回路
对于每个连通分量,若是欧拉回路则一笔画完,若不是则 需要: 奇度数点个数/2
然后把每个连通分量所需的笔数相加
这里要注意一个点是不用画的
#include<stdio.h> #include<algorithm> #include<iostream> #include<set> #include<math.h> #include<string.h> #define N 100010 using namespace std; int f[N],d[N],fenliang[N]; int find(int x){ if(x==f[x])return x; return f[x]=find(f[x]); } int main(){ int n,m,i,j,u,v; while(~scanf("%d%d",&n,&m)){ for(i=1;i<=n;i++)f[i]=i; memset(d,0,sizeof(d)); memset(fenliang,-1,sizeof(fenliang)); while(m--) { scanf("%d%d",&u,&v); if(u>v){j=u;u=v;v=j;} else if(u==v)continue; f[find(u)]=find(v); d[u]++,d[v]++; } int ans=0; for(i=1;i<=n;i++) { find(i); if(fenliang[f[i]]==-1 && d[i]>0)fenliang[f[i]]=0; if(d[i]&1)fenliang[f[i]]++; } for(i=1;i<=n;i++) if(fenliang[i]>0)ans+=fenliang[i]/2; else if(fenliang[i]==0)ans++; printf("%d ",ans); } return 0; } /* 4 7 1 2 1 3 1 4 2 3 2 4 3 4 3 3 4 5 1 2 2 3 4 4 4 4 4 4 */