/*无向欧拉图的欧拉回路存在的充要条件:连通且没有奇点;
欧拉路径存在的充要条件:连通且奇点个数为2*/
#include <stdio.h>
#include <string.h>
#define MAX 100002
int father[MAX],flag[MAX];
int map[MAX],degree[MAX],odd[MAX];
void init(int n)
{
int i;
memset(flag,0,sizeof(flag));
memset(degree,0,sizeof(degree));
memset(map,0,sizeof(map));
memset(odd,0,sizeof(odd));
for(i=1;i<=n;i++)
{
father[i]=i;
}
}
int find(int x)
{
while(x!=father[x])
x=father[x];
return x;
}
void Union(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
father[fx]=fy;
}
int main()
{
int n,m,x,y,i,root,k,ans=0;
while(scanf("%d %d",&n,&m)!=EOF)
{
k=ans=0;
init(n);
for (i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
Union(x,y);
degree[x]++;
degree[y]++;
}
for (i=1;i<=n;i++)
{
root=find(i);//集合的根
if(!flag[root])
{
map[k++]=root;//map保存着集合,集合就是图
flag[root]=1;
}
if(degree[i]%2==1)
odd[root]++;//保存这个集合的奇数度数的个数
}
for (i=0;i<k;i++)
{
int temp=map[i];
if(degree[temp]==0)
continue;//孤立点
if(odd[temp]==0)
ans++;//该集合是欧拉回路
else
ans+=odd[temp]/2;//度数数为奇数的点必须是由第一种画出来的,所以奇数/2就是画的笔数。
}
printf("%d\n",ans);
}
return 0;
}
hdu3018 Ant Trip
最新推荐文章于 2019-11-18 21:41:22 发布