欧拉回路
解题思路:
并查集 + 离散数学知识
#include<iostream>
#include<cstring>
using namespace std;
int pre[1005],num,du[1005];
int root(int x)
{
if (x!=pre[x])
pre[x]=root(pre[x]);
return pre[x];
}
void merge(int x,int y)
{
int m=root(x);
int n=root(y);
if (m!=n)
{
pre[m]=n;
num--;
}
return ;
}
int main(void)
{
int n,m;
while (cin>>n)
{
num=n-1;
bool flag=1;
if (n==0)
break;
else
cin>>m;
for (int i=1;i<=n;i++)
pre[i]=i;
memset(du,0,sizeof(du)); //初始化
for (int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
merge(a,b);
du[a]++;
du[b]++;
} //并查集判断连通性,如果num>0说明还有点未到达
if (num!=0)
{
cout<<0<<endl;
continue;
}
for (int i=1;i<=n;i++)
if (du[i]%2!=0) //根据离散数学上地推论,判断连通地无向图是否存在欧拉回路,就是判断是否所有点都为偶数
{ //若都为偶数则存在,反正不存在
cout<<0<<endl;
flag=0;
break;
}
if (flag)
cout<<1<<endl;
}
}