Skip to content

Commit 47a8c8c

Browse files
lrvideckisweb-flow
andauthored
euler walk first draft (#186)
* euler walk first draft * [auto-verifier] verify commit fa84857 * nits * [auto-verifier] verify commit f28be0d * ni * [auto-verifier] verify commit 36770a6 * add docs now * [auto-verifier] verify commit f920eba * renaming * update --------- Co-authored-by: GitHub <noreply@github.com>
1 parent 08f0c2d commit 47a8c8c

4 files changed

Lines changed: 119 additions & 0 deletions

File tree

.verify-helper/timestamps.remote.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@
6363
"tests/library_checker_aizu_tests/graphs/dijkstra_lib_checker.test.cpp": "2025-08-14 10:27:46 -0600",
6464
"tests/library_checker_aizu_tests/graphs/directed_cycle.test.cpp": "2026-01-17 13:05:42 -0700",
6565
"tests/library_checker_aizu_tests/graphs/enumerate_triangles.test.cpp": "2025-08-06 16:18:37 -0600",
66+
"tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp": "2026-02-26 13:17:25 -0700",
67+
"tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp": "2026-02-26 13:17:25 -0700",
6668
"tests/library_checker_aizu_tests/graphs/hopcroft_karp_aizu.test.cpp": "2025-12-11 21:47:53 +0000",
6769
"tests/library_checker_aizu_tests/graphs/hopcroft_karp_lib_checker.test.cpp": "2025-12-11 21:47:53 +0000",
6870
"tests/library_checker_aizu_tests/graphs/mst.test.cpp": "2026-01-22 10:08:22 -0700",

library/graphs/euler_path.hpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#pragma once
2+
//! @code
3+
//! vector<basic_string<array<int, 2>>> adj(n);
4+
//! rep(i, 0, m) {
5+
//! int u, v;
6+
//! cin >> u >> v;
7+
//! u--, v--;
8+
//! adj[u] += {v, i};
9+
//! }
10+
//! vector<pii> path = euler_path(adj, m, source);
11+
//! @endcode
12+
//! @time O(n + m)
13+
//! @space O(n + m)
14+
vector<pii> euler_path(auto& adj, int m, int s) {
15+
vi vis(m);
16+
vector<pii> path;
17+
auto dfs = [&](auto&& self, int u, int eu) -> void {
18+
while (!empty(adj[u])) {
19+
auto [v, ev] = adj[u].back();
20+
adj[u].pop_back();
21+
if (!vis[ev]) vis[ev] = 1, self(self, v, ev);
22+
}
23+
path.emplace_back(u, eu);
24+
};
25+
dfs(dfs, s, -1);
26+
ranges::reverse(path);
27+
return path;
28+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#define PROBLEM \
2+
"https://judge.yosupo.jp/problem/eulerian_trail_directed"
3+
#include "../template.hpp"
4+
#include "../../../library/graphs/euler_path.hpp"
5+
int main() {
6+
cin.tie(0)->sync_with_stdio(0);
7+
int t;
8+
cin >> t;
9+
while (t--) {
10+
int n, m;
11+
cin >> n >> m;
12+
vector<vector<pii>> adj(n);
13+
vi deg(n);
14+
int s = -1;
15+
rep(i, 0, m) {
16+
int u, v;
17+
cin >> u >> v;
18+
s = u;
19+
adj[u].emplace_back(v, i);
20+
deg[u]++;
21+
deg[v]--;
22+
}
23+
if (*max_element(all(deg)) >= 2) {
24+
cout << "No" << '\n';
25+
continue;
26+
}
27+
if (ranges::count(deg, 1) >= 2) {
28+
cout << "No" << '\n';
29+
continue;
30+
}
31+
auto it = ranges::find(deg, 1);
32+
if (it != end(deg)) s = it - begin(deg);
33+
else if (s == -1) s = 0;
34+
vector<pii> res = euler_path(adj, m, s);
35+
if (ssize(res) != m + 1) {
36+
cout << "No" << '\n';
37+
continue;
38+
}
39+
cout << "Yes" << '\n';
40+
rep(i, 0, sz(res)) cout << res[i].first << ' ';
41+
cout << '\n';
42+
rep(i, 1, sz(res)) cout << res[i].second << ' ';
43+
cout << '\n';
44+
}
45+
return 0;
46+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#define PROBLEM \
2+
"https://judge.yosupo.jp/problem/eulerian_trail_undirected"
3+
#include "../template.hpp"
4+
#include "../../../library/graphs/euler_path.hpp"
5+
int main() {
6+
cin.tie(0)->sync_with_stdio(0);
7+
int t;
8+
cin >> t;
9+
while (t--) {
10+
int n, m;
11+
cin >> n >> m;
12+
vector<vector<pii>> adj(n);
13+
vi deg(n);
14+
int s = -1;
15+
rep(i, 0, m) {
16+
int u, v;
17+
cin >> u >> v;
18+
s = u;
19+
adj[u].emplace_back(v, i);
20+
adj[v].emplace_back(u, i);
21+
deg[u] ^= 1;
22+
deg[v] ^= 1;
23+
}
24+
if (ranges::count(deg, 1) > 2) {
25+
cout << "No" << '\n';
26+
continue;
27+
}
28+
auto it = ranges::find(deg, 1);
29+
if (it != end(deg)) s = it - begin(deg);
30+
else if (s == -1) s = 0;
31+
vector<pii> res = euler_path(adj, m, s);
32+
if (ssize(res) != m + 1) {
33+
cout << "No" << '\n';
34+
continue;
35+
}
36+
cout << "Yes" << '\n';
37+
rep(i, 0, sz(res)) cout << res[i].first << ' ';
38+
cout << '\n';
39+
rep(i, 1, sz(res)) cout << res[i].second << ' ';
40+
cout << '\n';
41+
}
42+
return 0;
43+
}

0 commit comments

Comments
 (0)