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;
}
标签:head,int,路径,dfs,++,回路,欧拉
From: https://www.cnblogs.com/Yuan-Jiawei/p/18315340