您的位置:首页 > 其它

hdu 3018 欧拉回路

2017-02-28 17:22 211 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: