如果⼀个连通图的所有结点的度都是偶数,那么它就是
Eulerian
,如果除了两个结点的度是
奇数其他都是偶数,那么它就是
Semi-Eulerian
,否则就是
Non-Eulerian
处理出每个节点的度后,判断一次连通性。
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
using namespace std;
const int N=3000+5;
int n,m;
int d[N][N],cnt[N];
int vis[N];
int tot,op;
void dfs(int u){
vis[u]=1;
tot++;
rep(i,1,n+1)
if(!vis[i]&&d[u][i]) dfs(i);
return;
}
int main(){
cin>>n>>m;
while(m--){
int a,b;cin>>a>>b;
d[a][b]=d[b][a]=1;
cnt[a]++,cnt[b]++;
}
rep(i,1,n+1){
printf("%d%c",cnt[i],i==n?'\n':' ');
if(cnt[i]%2==1) op++;
}
dfs(1);
if(n==tot){
if(op==0)puts("Eulerian");
else if(op==2) puts("Semi-Eulerian");
else puts("Non-Eulerian");
}
else puts("Non-Eulerian");
return 0;
}