问题描述:判断一个无向图是否可以从一个节点出发,所有边只遍历一次,并回到原点。
解题思路:题中说明需判断每个节点的度。如果度全为偶数,则为 Eulerian。有两个奇数semi-Eulerian,其他则NOT。注意需判断图是否为一个连通图。
AC代码:
#include<iostream>
#include<vector>
using namespace std;
#define MAX 510
vector<int>arr[MAX];
bool vis[MAX]={0};
void dfs(int v,int &cnt)//检查是否是连通图
{
vis[v]=1;++cnt;
for(int i=0;i<arr[v].size();++i){
if(!vis[arr[v][i]]){
dfs(arr[v][i],cnt);
}
}
}
int main()
{
freopen("test.txt","r",stdin);
int i,j,N,M,cnt=0;
char c;
scanf("%d %d",&N,&M);
while(M--){
scanf("%d %d",&i,&j);
arr[i].push_back(j);
arr[j].push_back(i);
}
for(i=1;i<=N;++i){//判断度
printf("%d",arr[i].size());
if(arr[i].size()%2)++cnt;
i==N?c='\n':c=' ';
printf("%c",c);
}
int num=0;
dfs(1,num);//连通图
if(cnt==2&&num==N){//num为一个连通图顶点个数。cnt为度为奇数的个数。
printf("Semi-Eulerian");
}else if(cnt==0&&num==N){
printf("Eulerian");
}else printf("Non-Eulerian");
return 0;
}