一笔画问题,无向图欧拉路或者欧拉回路,注意题目说了,如果是孤立点,则不用考虑。对于每个连通块,如果全都是偶数度(欧拉回路),则需要1笔;如果不是,则需要奇数度顶点个数的1/2笔。
代码:
#include<bits/stdc++.h> using namespace std; int par[100005]; struct node { int du; int ji; }G[100005]; int u[2*100005],v[2*100005]; void init(int n) { for(int i=1;i<=n;i++) par[i]=i; } int find(int x) { if(x!=par[x]) par[x]=find(par[x]); return par[x]; } void union_(int x,int y) { x=find(x); y=find(y); if(x!=y) { par[y]=x; G[x].ji+=G[y].ji; } } int main() { int n,m; while(scanf("%d%d",&n,&m)==2) { int count=0; for(int i=1;i<=n;i++) { G[i].du=0; G[i].ji=0; } init(n); for(int i=1;i<=m;i++) { scanf("%d%d",&u[i],&v[i]); G[u[i]].du++; G[v[i]].du++; } for(int i=1;i<=n;i++) if(G[i].du&1) G[i].ji=1; for(int i=1;i<=m;i++) union_(u[i],v[i]); for(int i=1;i<=n;i++) if(par[i]==i&&G[i].du!=0) { if(G[i].ji==0)//奇数点个数为 0,欧拉回路(一笔画) count++; else count+=G[i].ji/2; } printf("%d\n",count); } return 0; }