hdu 3018 欧拉回路

来源:互联网 发布:民生银行软件有问题 编辑:程序博客网 时间:2024/06/03 11:41
#include<iostream>#include<vector>using namespace std;const int maxn=1e5+5;int fa[maxn],num[maxn],odd[maxn],du[maxn],n,m,u,v,res;void init(){    fill(num+1,num+n+1,0);    fill(odd+1,odd+n+1,0);    fill(du+1,du+n+1,0);    res=0;    for(int i=1;i<=n;i++)        fa[i]=i;}int find(int point){    if(fa[point]==point)        return point;    return fa[point]=find(fa[point]);}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        init();        while(m--&&scanf("%d%d",&u,&v)!=EOF)        {            int fau=find(u),fav=find(v);            du[v]++;            du[u]++;            if(fau!=fav)                fa[fau]=fav;        }        for(int i=1;i<=n;i++)        {            int fai=find(i);            num[fai]++;            if(du[i]&1)                odd[fai]++;        }        for(int i=1;i<=n;i++)        {            int fai=find(i);            //cout<<num[fai]<<endl;            if(num[i]<=1)                continue;            if(odd[fai])                res+=odd[fai]/2;            else                res++;        }        printf("%d\n",res);    }    return 0;}

0 0