hdu3018 Ant Trip 欧拉回路
题意是几笔可以画完所给的图,其中没有与其他点连同的不需要考虑。
先用并查集将点分成不同的集合,由于题目是问几笔,所以不用考虑连通性。只需要考虑不同集合根节点中记录的这个集合奇度节点的个数,如果是零,最后答案加一,反之加上除二后的结果。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=150000+5;
int n,m,p[N],ans,in[N],odd[N],even[N];
int Find(int x)
{
if(p[x]==x) return x;
else return p[x]=Find(p[x]);
}
void Union(int a,int b)
{
int f1=Find(a),f2=Find(b);
if(f1!=f2) p[f1]=f2;
}
int main()
{
int i,j,u,v;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
{
p[i]=i;
in[i]=0;
odd[i]=0;
even[i]=0;
}
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
u--;
v--;
Union(u,v);
in[u]++;
in[v]++;
}
for(i=0;i<n;i++)
{
int f=Find(i);
if(in[i]==0) continue;
if(in[i]%2==0) even[f]++;
else odd[f]++;
}
ans=0;
for(i=0;i<n;i++)
{
if(p[i]!=i||!in) continue;
if(odd[i]==0&&even[i]==0) continue;
else if(odd[i]==0) ans++;
else ans+=odd[i]/2;
}
printf("%d\n",ans);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/