HDU 3018 Ant Trip 欧拉路 并查集

来源:互联网 发布:scratch2.0趣味编程 编辑:程序博客网 时间:2024/06/06 09:25

HDU 3018 Ant Trip 欧拉路 并查集

开始的时候没有看清题  以为是每个联通图判断欧拉路就行了 

#include<iostream>#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<vector>using namespace std;//hdu3018 对于联通的图判断奇数度数的个数 如果==0 就+1 就行了 否者 加奇数个数的1/2#define maxn 100005#define maxm 200005 int degree[maxn],pa[maxn],flag[maxn];int n,m,x,y;void init()  {      memset(degree,0,sizeof(degree));    memset(flag,0,sizeof(flag));      for(int i=1;i<=n;i++)      {          pa[i]=i;      }  }  int find(int x) {      return pa[x] == x ? x : pa[x] = find(pa[x]);  }  void unite(int x, int y) {      x = find(x);      y = find(y);      if(x == y) return;      pa[x] = y;   }  int main(){while(scanf("%d%d",&n,&m)==2){init();int count=0;for(int i=0;i<m;i++){scanf("%d%d",&x,&y);degree[x]++;degree[y]++;unite(x,y);}for(int i=1;i<=n;i++){if(degree[i]&1)flag[find(i)]++;}for(int i=1;i<=n;i++){if(find(i)==i &°ree[i]){if(flag[i]==0) count++;else count+=flag[i]/2;} }printf("%d\n",count);} } 


0 0