欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个无向图,问是否存在欧拉回路?
判断欧拉回路的条件
1.出度和入度都为偶数
2.连通性(用并查集只有一个父节点等于本身)
#include<bits/stdc++.h>
using namespace std;
/*
判断欧拉回路的条件
1.出度和入度都为偶数
2.连通性(用并查集只有一个父节点等于本身)
*/
const int N = 1010;
int fa[N];
vector<int> g[N];
int n,m;
void init(){
for(int i = 1; i <= n; i++){
fa[i] = i;
}
}
int find(int x){
if(x == fa[x]){
return x;
}else
return fa[x] = find(fa[x]);
}
void merge(int x, int y){
int fx = find(x);
int fy = find(y);
if(fx!= fy){
fa[fx] = fy;
}
}
int main(){
cin>>n>>m;
init();
int a,b;
for(int i = 1; i <= m; i++){
scanf("%d%d",&a,&b);
merge(a,b);
g[a].push_back(b);
g[b].push_back(a);
}
int cnt = 0, num = 0;
for(int i = 1; i <= n ; i++){
if(g[i].size() % 2){//确定出度和入度都为偶数
cnt++;
}
if(fa[i] == i){//判断连通性即num==1
num++;
}
}
if(cnt==0&&num==1){
cout<<"1"<<endl;
}else{
cout<<"0"<<endl;
}
return 0;
}