PAT 甲级 1126 Eulerian Path (25 分)

思路:

1.结点度数全为偶数的为欧拉回路;
2.度数为奇数的结点数量为1或大于3的为非欧拉路径;
3.度数为奇数的结点数量为2的为欧拉路径;
(PS:很多大佬讲这是根据题意得出的,本杠精小声bb一下,除了第一点题目也没说数量为2的就一定有欧拉路径,当然了每个人理解可能不一样,2、3两点稍微推理下也能得出来)
4.非连通图没有欧拉回路或者欧拉路径;

代码:

#include<iostream>
#include<vector>
using namespace std;
bool isv[501];
vector<vector<int>> v;
void dfs(int n){
	isv[n]=true;
	for(int i=0;i<v[n].size();i++)
		if(!isv[v[n][i]]) dfs(v[n][i]);
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	v.resize(n+1);
	for(int i=1;i<=m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		v[a].push_back(b);
		v[b].push_back(a);
	}
	int cnt=0;
	for(int i=1;i<=n;i++){
		printf(i==1?"%d":" %d",v[i].size());
		if(v[i].size()%2) cnt++;
	}
	if(cnt==1||cnt>2) printf("\nNon-Eulerian");
	else{
		dfs(1);
		bool iscon=true;
		for(int i=1;i<=n;i++)
			if(!isv[i]) iscon=false;
		if(!iscon) printf("\nNon-Eulerian");
		else if(cnt==0) printf("\nEulerian");
		else if(cnt==2) printf("\nSemi-Eulerian");
	}
	return 0;
}
posted @ 2019-08-24 16:00  YuhanのBlog  阅读(66)  评论(0编辑  收藏  举报