欧拉回路
算法思想
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=1010, M=1e6+10;
int n,m;
int h[N],e[M],ne[M],idx;
int cnt[N];//记录某个点的度
int num; //记录遍历图时走过的边的数量,以便确定是否是回路
bool stu[M]; //判断某条边是是否走过,false为未走过,true为走过
void insert(int a,int b) //添加一条边a->b
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void initialize() //初始化链表
{
idx=0;
memset(h,-1,sizeof h);
memset(e,0,sizeof e);
memset(ne,0,sizeof ne);
memset(cnt,0,sizeof cnt);
memset(stu,0,sizeof stu);
num=0;
}
void dfs(int u)
{
for(int i=h[u];~i;i=ne[i])
{
if(stu[i]) //此边被遍历,直接删
{
h[u]=ne[i];//降低时间复杂度
continue;
}
else //没有用过,则标记后也要删掉
h[u]=ne[i];
{stu[i^1]=true; //因为是无向边,所以要把回去的边也删掉
stu[i]=true;
dfs(e[i]);
num++;}
}
}
int main()
{
while(cin>>n>>m&&n!=0)
{
initialize();
int flag=1;
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
insert(a,b);
insert(b,a);
cnt[a]++;
cnt[b]++;
}
for(int i=1;i<=n;i++)
{
if(cnt[i]%2!=0) //找到度数为奇数的点,则无法形成欧拉回路
{
cout<<"0"<<endl;
flag=0;
break;
}
}
for(int i=1;i<=n;i++)
{
if(h[i]!=-1)
{
dfs(i);
break;
}
}
if(num<m&&flag)
{
flag=0;
cout<<"0"<<endl;
}
if(flag) cout<<"1"<<endl;
}
return 0;
}