//并查集+简单的欧拉路条数判断
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int NN=100005;
int degree[NN],p[NN],odd[NN];
int n,m;
int pp(int x)
{
if (p[x]!=x) p[x]=pp(p[x]);
return p[x];
}
void init()
{
for (int i=1; i<=n; i++)
{
degree[i]=0;
odd[i]=0;
p[i]=i;
}
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
init();
int x,y;
for (int i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
degree[x]++;
degree[y]++;
p[pp(y)]=pp(x);
}
int sum=0;
for (int i=1; i<=n; i++)
{
if (degree[i]%2==1) odd[pp(i)]++;
}
for (int i=1; i<=n; i++)
{
if (pp(i)==i && degree[i]) //孤立点不计;
{
if (odd[i]==0) sum++; //此连通子图集为一条欧拉回路
else sum+=odd[i]/2; //个人觉得无向图的子连通块中,度为奇数的结点数必为偶数个,怎么之前写sum+=(odd[i]+1)/2就WA了咧?
}
}
printf("%d\n",sum);
}
return 0;
}
HDOJ3018欧拉路,几笔画判断
最新推荐文章于 2020-05-07 17:35:55 发布