思路:
1.结点度数全为偶数的为欧拉回路;
2.度数为奇数的结点数量为1或大于3的为非欧拉路径;
3.度数为奇数的结点数量为2的为欧拉路径;
(PS:很多大佬讲这是根据题意得出的,本杠精小声bb一下,除了第一点题目也没说数量为2的就一定有欧拉路径,当然了每个人理解可能不一样,2、3两点稍微推理下也能得出来)
4.非连通图没有欧拉回路或者欧拉路径;
代码:
#include<iostream>
#include<vector>
using namespace std;
bool isv[501];
vector<vector<int>> v;
void dfs(int n){
isv[n]=true;
for(int i=0;i<v[n].size();i++)
if(!isv[v[n][i]]) dfs(v[n][i]);
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
v.resize(n+1);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
int cnt=0;
for(int i=1;i<=n;i++){
printf(i==1?"%d":" %d",v[i].size());
if(v[i].size()%2) cnt++;
}
if(cnt==1||cnt>2) printf("\nNon-Eulerian");
else{
dfs(1);
bool iscon=true;
for(int i=1;i<=n;i++)
if(!isv[i]) iscon=false;
if(!iscon) printf("\nNon-Eulerian");
else if(cnt==0) printf("\nEulerian");
else if(cnt==2) printf("\nSemi-Eulerian");
}
return 0;
}