Loading

欧拉图、欧拉路径、欧拉回路

P7771 【模板】欧拉路径

欧拉路径的模板题。

思路

首先判断是否有欧拉路径,然后排序,找出起点,最后 dfs 找路径。

代码

细节多,比如要判断一个点是否存在(这个题目不需要)。

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

vector<int> e[N];
int head[N], in[N], out[N];

void add(int u, int v) {
	in[v]++, out[u]++;
	e[u].push_back(v);
}

int n, m;

vector<int> ans; // 倒序存储

void dfs(int u) {
	for (int i = head[u]; i < e[u].size(); i = head[u]) {
		head[u]++; 
		dfs(e[u][i]);
	}
	ans.push_back(u);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int u, v;
		cin >> u >> v;
		add(u, v);
	}

	int cnt1 = 0, cnt2 = 0, st = -1;

	for (int i = 1; i <= n; i++) {
		if (in[i] - out[i] == 1) cnt1++;
		else if (out[i] - in[i] == 1) cnt2++, st = i;
	}

	if (!((cnt1 == 1 && cnt2 == 1) || (cnt1 == 0 && cnt2 == 0))) {// 判断是否有欧拉回路
		cout << "No\n";
		return 0;
	}
	for (int i = 1; i <= n; i++) sort(e[i].begin(), e[i].end());// 排序
	if (st == -1) { // 欧拉回路要特殊处理起点
		for (int i = 1; i <= n; i++) {
			if (in[i] || out[i]) {
				st = i;
				break;
			}
		}
	}
	dfs(st);
	for (int i = ans.size() - 1; i >= 0; i--) cout << ans[i] << ' ';
	return 0;
}
posted @ 2024-07-22 09:07  SunnyYuan  阅读(3)  评论(0编辑  收藏  举报