欧拉图判断
用度数和是否为一个图进行判定
欧拉路径:所有路径都走且只走一遍,只有两个点的度数是奇数,其他都是偶数
欧拉回路:所有路径都走且只走一遍,所有点的度数都是偶数
欧拉图:含有欧拉回路的图
半欧拉图:含有欧拉路径的图
非欧拉图:除了不满足以上情况外,还可能所有点不在一个图上
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <cstring>
#include <cmath>
#include <map>
using namespace std;
int n,m;
int degree[510];
int edge[510][510];
int inf = 99999999;
int have[510];
int visit[510];
int num,sum;
void dfs(int node){
if(have[node] == inf){
return ;
}
visit[node] = 1;
for(int i=1; i<=n; i++){
if(visit[i]==0&&edge[node][i]!=inf){
dfs(i);
}
}
}
int main()
{
cin >> n >> m;
fill(edge[0],edge[0]+510*510,inf);
fill(have,have+510,inf);
for(int i=0; i<m; i++){
int a,b;
cin >> a >> b;
have[a] = a;
have[b] = b;
edge[a][b] = edge[b][a] = 1;
degree[a]++;
degree[b]++;
}
for(int i=1; i<=n; i++){
if(visit[i]==0){
dfs(i);
num++;
}
}
//cout << num << endl;
for(int i=1; i<=n; i++){
if(degree[i]%2!=0){
sum++;
}
if(i==1) cout << degree[i];
else cout << " " << degree[i];
}
cout << endl;
if(num>1||sum!=2&&sum!=0){
cout << "Non-Eulerian"<< endl;
}
else if(sum==2){
cout << "Semi-Eulerian" << endl;
}
else if(sum==0){
cout << "Eulerian" << endl;
}
return 0;
}