欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1126 Eulerian Path (25分)/图的遍历

程序员文章站 2024-03-19 19:26:34
...

题目描述

1126 Eulerian Path (25分)/图的遍历1126 Eulerian Path (25分)/图的遍历1126 Eulerian Path (25分)/图的遍历1126 Eulerian Path (25分)/图的遍历

题目大意

看着题目很长,其实题意很简单:
如果一个连通图的所有结点的度都是偶数,那么它就是Eulerian,如果除了两个结点的度是奇数其他都是偶数,那么它就是Semi-Eulerian,否则就是Non-Eulerian.

入坑

开始把问题想得太简单了,以为只需要判断各个顶点的度就行了,然后还以为只要图的每个顶点的度都不为0就是连通了…其实还是得用搜索算法遍历一遍才知道图是否连通。虽然这样也通过了很多测试点(只有一个没有通过)~

AC代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<vector<int>> adj;
bool vis[505];
int num=0;
void dfs(int u) {
	vis[u] = true; num++;
	for (int i = 0; i < adj[u].size(); i++) {
		int v = adj[u][i];
		if (vis[v] == 0) dfs(v);
	}
}
int main() {
	//freopen("1.txt", "r", stdin);
	int n, m; cin >> n >> m;
	adj.resize(n + 1);
	while(m--) {
		int c1, c2;
		scanf("%d%d", &c1, &c2);
		adj[c1].push_back(c2);
		adj[c2].push_back(c1);
	}
	dfs(1);
	int oddnum = 0;
	for (int i = 1; i <= n; i++) {
		if (i != 1) cout << " ";
		printf("%d", adj[i].size());
		if (adj[i].size() % 2 == 1) oddnum++;
	}
	cout << endl;
	if (num < n) printf("Non-Eulerian");
	else {
		if (oddnum == 0) printf("Eulerian");
		else if (oddnum == 2) printf("Semi-Eulerian");
		else printf("Non-Eulerian");
	}
	return 0;
}
相关标签: PAT 图论