题目很容易懂,就是判断一个无向图是否是欧拉图,或者半欧拉图,或者不是欧拉图。
有两个输出,第一行输出每个顶点的度,其实是提示从度这里入手。
其次有个细节需要注意的是,欧拉图需要连通,所以要判断整个图是否连通。
因为我自己写图的深度太弱,所以一上去提交就出错了。
这里有两种找图深度的写法。
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;
}