前言
正文在这里插入图片描述
参考题解
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
using namespace std;
/* 题意: 给定一个无向图,要你判断这个图是一个欧拉图还是半欧拉图,还是非欧拉图 思路: 首先什么是欧拉图?根据题意可得如下要求 1、 连通图所有的结点的度都是偶数 2、 如果奇数度的点有且仅有两个,那么它是半欧拉图 3、 既不是欧拉图也不是半欧拉图的为非欧拉图 4、非连通图一定不是欧拉图 */
const int N=5e2+10;
int n,m;
int oddCnt=0,evenCnt=0;//oddCnt表示度数奇数的结点个数,evenCnt则表示度数为偶数的结点个数
bool vis[N];
vector<int> g[N];
int degree[N];//degree[i]表示结点i的度数
void dfs(int index){
if(vis[index])return;
vis[index]=true;
degree[index]=g[index].size();
if(degree[index]%2==0)evenCnt++;
else oddCnt++;
for(int i=0;i<g[index].size();i++){
if(!vis[g[index][i]]){
dfs(g[index][i]);
}
}
}
int main(){
fill(vis,vis+N,false);
cin>>n>>m;
for(int i=0,a,b;i<m;i++){
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
int cnt=0;//连通分量的个数
// 遍历判断是否是连通图
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i);
cnt++;
}
}
//输出每个结点的度数
for(int i=1;i<=n;i++){
if(i!=1)printf(" ");
printf("%d",degree[i]);
}
cout<<endl;
//根据条件输出
if(cnt!=1) printf("Non-Eulerian");
else{
if(evenCnt==n)printf("Eulerian");
else if(oddCnt==2)printf("Semi-Eulerian");
else printf("Non-Eulerian");
}
return 0;
}