题目很容易懂,就是判断一个无向图是否是欧拉图,或者半欧拉图,或者不是欧拉图。
有两个输出,第一行输出每个顶点的度,其实是提示从度这里入手。
其次有个细节需要注意的是,欧拉图需要连通,所以要判断整个图是否连通。
因为我自己写图的深度太弱,所以一上去提交就出错了。
这里有两种找图深度的写法。
AC代码里是一种,这里另外再贴一种。其实就是初始值和自增位置的区别。

DFS记录深度

int depth=1;
int vis[505];
void dfs(int root){
	vis[root]=1;
	for(int i=0;i<G[root].size();i++){
		if(vis[G[root][i]]==0){
			depth++;   //不要重复把vis置1 
			dfs(G[root][i]); //继续深搜 
		}
	}
}

AC代码

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const int maxn=505;
vector<int> G[maxn];
int Hash[maxn];
int depth=0;
int vis[505]={0};
void dfs(int root){
	vis[root]=1;
	depth++;
	for(int i=0;i<G[root].size();i++){
		if(vis[G[root][i]]==0){
			dfs(G[root][i]);
		}
	}
}

int main(){
	int u,v;
	scanf("%d%d",&n,&m);
	memset(Hash,0,sizeof(Hash));
	for(int i=0;i<m;i++){
		scanf("%d%d",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
		Hash[u]++;
		Hash[v]++;
	}
	int flag=0;
	for(int i=1;i<=n;i++){
		if(i>1) printf(" ");
		printf("%d",Hash[i]);
		if(Hash[i]&1){
			flag++;
		}
	}
	dfs(1);
	putchar(10);
	if(flag==0&&depth==n) puts("Eulerian");
	else if(flag==2&&depth==n) puts("Semi-Eulerian");
	else puts("Non-Eulerian");
	
	
	return 0;
}