题目链接https://vjudge.net/contest/285333#problem/B
在无向图中,若该图为连通图且所有顶点的度都为偶数,则存在欧拉回路
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
int n,m;
int g[1010][1010]; //用二维数组来判断两个顶点之间是否存在边,若存在则为1,否则为0
int visit[1010];//广搜时用到,若该顶点已被访问过则为1,否则为0
int dig[1010];//用来记录顶点的度数
bool bfs(int s)//把图的第一个顶点作为参数
{
queue<int> duiwu;
memset(visit,0,sizeof(visit));
duiwu.push(s);
visit[s]=1;
while(!duiwu.empty())
{
int temp=duiwu.front();
for(int i=1;i<=n;i++)
{
if(g[temp][i]&&!visit[i])
{
duiwu.push(i);
visit[i]=1;
}
}
duiwu.pop();
}
for(int i=1;i<=n;i++)
{
if(visit[i]==0)
{
return false;
}
}
return true;
}
int main()
{
while(1)
{
cin>>n;
if(n==0)
break;
cin>>m;
memset(g,0,sizeof(g));
memset(dig,0,sizeof(dig));
for(int i=1;i<=m;i++)
{
int x1,x2;
cin>>x1>>x2;
g[x1][x2]=g[x2][x1]=1;
dig[x1]++;
dig[x2]++;
}
bool flag=true;
for(int i=1;i<=n;i++)
{
if(dig[i]%2==1)
{
flag=false; //如果存在一个顶点的度数为奇数,则不存在欧拉回路
break;
}
}
if(flag==false)
{
cout<<"0"<<endl;
continue;
}
if(bfs(1)) //经过广搜判断这个图是否连通
{
cout<<"1"<<endl;
}
else
{
cout<<"0"<<endl;
}
}
return 0;
}