3 3 1 2 2 3 1 3 4 2 1 2 3 4
1 2
一个连通图不会有奇数个奇数度顶点,画一画图可以知道,假如一个连通图所有点度数为偶数,答案为1,否则就是奇数度顶点的一半,累加求和。
代码:
/* *********************************************** Author :rabbit Created Time :2014/3/26 20:53:22 File Name :7.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; const int maxn=100100; int du[maxn],fa[maxn],ss[maxn]; int find(int x){ if(fa[x]!=x)fa[x]=find(fa[x]); return fa[x]; } void bin(int u,int v){ int t1=find(u),t2=find(v); if(t1!=t2)fa[t1]=t2; } int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int n,m; while(~scanf("%d%d",&n,&m)){ memset(du,0,sizeof(du)); memset(ss,-1,sizeof(ss)); for(int i=1;i<=n;i++)fa[i]=i; while(m--){ int u,v; scanf("%d%d",&u,&v); du[u]++;du[v]++; bin(u,v); } for(int i=1;i<=n;i++){ int t=find(i); if(ss[t]==-1&&du[i]>0)ss[t]=0; if(du[i]&1)ss[t]++; } int ans=0; for(int i=1;i<=n;i++) if(ss[i]>0)ans+=ss[i]/2; else if(ss[i]==0)ans++; cout<<ans<<endl; } return 0; }
hdu 3018 并查集+顶点度数判定,布布扣,bubuko.com
原文:http://blog.csdn.net/xianxingwuguan1/article/details/22213013