From fa84857a3b6b1c6db76979f88e29f2f4d2d41f61 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Thu, 26 Feb 2026 12:35:17 -0700 Subject: [PATCH 01/10] euler walk first draft --- library/graphs/euler_walk.hpp | 18 +++++++ .../graphs/euler_walk_directed.test.cpp | 48 +++++++++++++++++++ .../graphs/euler_walk_undirected.test.cpp | 45 +++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 library/graphs/euler_walk.hpp create mode 100644 tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp create mode 100644 tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp diff --git a/library/graphs/euler_walk.hpp b/library/graphs/euler_walk.hpp new file mode 100644 index 00000000..be9e2908 --- /dev/null +++ b/library/graphs/euler_walk.hpp @@ -0,0 +1,18 @@ +#pragma once +vector euler_walk(auto& adj, int m, int s) { + vi vis(m); + vector path; + auto dfs = [&](auto&& self, int u, int e) -> void { + while (!empty(adj[u])) { + auto [v, e_id] = adj[u].back(); + adj[u].pop_back(); + if (vis[e_id]) continue; + vis[e_id] = 1; + self(self, v, e_id); + } + path.push_back({u, e}); + }; + dfs(dfs, s, -1); + ranges::reverse(path); + return path; +} diff --git a/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp b/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp new file mode 100644 index 00000000..9c14794a --- /dev/null +++ b/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp @@ -0,0 +1,48 @@ +#define PROBLEM \ + "https://judge.yosupo.jp/problem/eulerian_trail_directed" +#include "../template.hpp" +#include "../../../library/graphs/euler_walk.hpp" +int main() { + cin.tie(0)->sync_with_stdio(0); + int t; + cin >> t; + while (t--) { + int n, m; + cin >> n >> m; + vector> adj(n); + vector deg(n); + int s = -1; + for (int i = 0; i < m; i++) { + int u, v; + cin >> u >> v; + s = u; + adj[u].push_back({v, i}); + deg[u]++; + deg[v]--; + } + if (*max_element(all(deg)) >= 2) { + cout << "No" << '\n'; + continue; + } + if (ranges::count(deg, 1) >= 2) { + cout << "No" << '\n'; + continue; + } + auto it = ranges::find(deg, 1); + if (it != end(deg)) s = it - begin(deg); + else if (s == -1) s = 0; + vector res = euler_walk(adj, m, s); + if (ssize(res) != m + 1) { + cout << "No" << '\n'; + continue; + } + cout << "Yes" << '\n'; + for (int i = 0; i < ssize(res); i++) + cout << res[i].first << ' '; + cout << '\n'; + for (int i = 1; i < ssize(res); i++) + cout << res[i].second << ' '; + cout << '\n'; + } + return 0; +} diff --git a/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp b/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp new file mode 100644 index 00000000..4376a77e --- /dev/null +++ b/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp @@ -0,0 +1,45 @@ +#define PROBLEM \ + "https://judge.yosupo.jp/problem/eulerian_trail_undirected" +#include "../template.hpp" +#include "../../../library/graphs/euler_walk.hpp" +int main() { + cin.tie(0)->sync_with_stdio(0); + int t; + cin >> t; + while (t--) { + int n, m; + cin >> n >> m; + vector> adj(n); + vector deg(n); + int s = -1; + for (int i = 0; i < m; i++) { + int u, v; + cin >> u >> v; + s = u; + adj[u].push_back({v, i}); + adj[v].push_back({u, i}); + deg[u] ^= 1; + deg[v] ^= 1; + } + if (ranges::count(deg, 1) > 2) { + cout << "No" << '\n'; + continue; + } + auto it = ranges::find(deg, 1); + if (it != end(deg)) s = it - begin(deg); + else if (s == -1) s = 0; + vector res = euler_walk(adj, m, s); + if (ssize(res) != m + 1) { + cout << "No" << '\n'; + continue; + } + cout << "Yes" << '\n'; + for (int i = 0; i < ssize(res); i++) + cout << res[i].first << ' '; + cout << '\n'; + for (int i = 1; i < ssize(res); i++) + cout << res[i].second << ' '; + cout << '\n'; + } + return 0; +} From 9483661e1a6f664e77f7c0e7f9af2bca9b6dfe88 Mon Sep 17 00:00:00 2001 From: GitHub Date: Thu, 26 Feb 2026 19:37:34 +0000 Subject: [PATCH 02/10] [auto-verifier] verify commit fa84857a3b6b1c6db76979f88e29f2f4d2d41f61 --- .verify-helper/timestamps.remote.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index 47570f79..247381c7 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -63,6 +63,8 @@ "tests/library_checker_aizu_tests/graphs/dijkstra_lib_checker.test.cpp": "2025-08-14 10:27:46 -0600", "tests/library_checker_aizu_tests/graphs/directed_cycle.test.cpp": "2026-01-17 13:05:42 -0700", "tests/library_checker_aizu_tests/graphs/enumerate_triangles.test.cpp": "2025-08-06 16:18:37 -0600", +"tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp": "2026-02-26 12:35:17 -0700", +"tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp": "2026-02-26 12:35:17 -0700", "tests/library_checker_aizu_tests/graphs/hopcroft_karp_aizu.test.cpp": "2025-12-11 21:47:53 +0000", "tests/library_checker_aizu_tests/graphs/hopcroft_karp_lib_checker.test.cpp": "2025-12-11 21:47:53 +0000", "tests/library_checker_aizu_tests/graphs/mst.test.cpp": "2026-01-22 10:08:22 -0700", From f28be0d481799b1cebcfa60ce9a0d910046cda88 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Thu, 26 Feb 2026 12:48:27 -0700 Subject: [PATCH 03/10] nits --- library/graphs/euler_walk.hpp | 10 ++++------ .../graphs/euler_walk_directed.test.cpp | 2 +- .../graphs/euler_walk_undirected.test.cpp | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/library/graphs/euler_walk.hpp b/library/graphs/euler_walk.hpp index be9e2908..083191b8 100644 --- a/library/graphs/euler_walk.hpp +++ b/library/graphs/euler_walk.hpp @@ -2,15 +2,13 @@ vector euler_walk(auto& adj, int m, int s) { vi vis(m); vector path; - auto dfs = [&](auto&& self, int u, int e) -> void { + auto dfs = [&](auto&& self, int u, int eu) -> void { while (!empty(adj[u])) { - auto [v, e_id] = adj[u].back(); + auto [v, ev] = adj[u].back(); adj[u].pop_back(); - if (vis[e_id]) continue; - vis[e_id] = 1; - self(self, v, e_id); + if (!vis[ev]) vis[ev] = 1, self(self, v, ev); } - path.push_back({u, e}); + path.emplace_back(u, eu); }; dfs(dfs, s, -1); ranges::reverse(path); diff --git a/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp b/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp index 9c14794a..2b678b8c 100644 --- a/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp +++ b/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp @@ -16,7 +16,7 @@ int main() { int u, v; cin >> u >> v; s = u; - adj[u].push_back({v, i}); + adj[u].emplace_back(v, i); deg[u]++; deg[v]--; } diff --git a/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp b/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp index 4376a77e..f8d5852d 100644 --- a/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp +++ b/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp @@ -16,8 +16,8 @@ int main() { int u, v; cin >> u >> v; s = u; - adj[u].push_back({v, i}); - adj[v].push_back({u, i}); + adj[u].emplace_back(v, i); + adj[v].emplace_back(u, i); deg[u] ^= 1; deg[v] ^= 1; } From cab571fa8535b9fbca5a3b78afe75e6867e44e2e Mon Sep 17 00:00:00 2001 From: GitHub Date: Thu, 26 Feb 2026 19:50:59 +0000 Subject: [PATCH 04/10] [auto-verifier] verify commit f28be0d481799b1cebcfa60ce9a0d910046cda88 --- .verify-helper/timestamps.remote.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index 247381c7..51d1be76 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -63,8 +63,8 @@ "tests/library_checker_aizu_tests/graphs/dijkstra_lib_checker.test.cpp": "2025-08-14 10:27:46 -0600", "tests/library_checker_aizu_tests/graphs/directed_cycle.test.cpp": "2026-01-17 13:05:42 -0700", "tests/library_checker_aizu_tests/graphs/enumerate_triangles.test.cpp": "2025-08-06 16:18:37 -0600", -"tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp": "2026-02-26 12:35:17 -0700", -"tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp": "2026-02-26 12:35:17 -0700", +"tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp": "2026-02-26 12:48:27 -0700", +"tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp": "2026-02-26 12:48:27 -0700", "tests/library_checker_aizu_tests/graphs/hopcroft_karp_aizu.test.cpp": "2025-12-11 21:47:53 +0000", "tests/library_checker_aizu_tests/graphs/hopcroft_karp_lib_checker.test.cpp": "2025-12-11 21:47:53 +0000", "tests/library_checker_aizu_tests/graphs/mst.test.cpp": "2026-01-22 10:08:22 -0700", From 84315eed166649d5c1dfa1accf0d4f49da9cad62 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Thu, 26 Feb 2026 12:51:30 -0700 Subject: [PATCH 05/10] ni --- .../graphs/euler_walk_directed.test.cpp | 10 ++++------ .../graphs/euler_walk_undirected.test.cpp | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp b/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp index 2b678b8c..e1f7246e 100644 --- a/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp +++ b/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp @@ -10,9 +10,9 @@ int main() { int n, m; cin >> n >> m; vector> adj(n); - vector deg(n); + vi deg(n); int s = -1; - for (int i = 0; i < m; i++) { + rep(i, 0, m) { int u, v; cin >> u >> v; s = u; @@ -37,11 +37,9 @@ int main() { continue; } cout << "Yes" << '\n'; - for (int i = 0; i < ssize(res); i++) - cout << res[i].first << ' '; + rep(i, 0, sz(res)) cout << res[i].first << ' '; cout << '\n'; - for (int i = 1; i < ssize(res); i++) - cout << res[i].second << ' '; + rep(i, 1, sz(res)) cout << res[i].second << ' '; cout << '\n'; } return 0; diff --git a/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp b/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp index f8d5852d..3b189b90 100644 --- a/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp +++ b/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp @@ -10,9 +10,9 @@ int main() { int n, m; cin >> n >> m; vector> adj(n); - vector deg(n); + vi deg(n); int s = -1; - for (int i = 0; i < m; i++) { + rep(i, 0, m) { int u, v; cin >> u >> v; s = u; @@ -34,11 +34,9 @@ int main() { continue; } cout << "Yes" << '\n'; - for (int i = 0; i < ssize(res); i++) - cout << res[i].first << ' '; + rep(i, 0, sz(res)) cout << res[i].first << ' '; cout << '\n'; - for (int i = 1; i < ssize(res); i++) - cout << res[i].second << ' '; + rep(i, 1, sz(res)) cout << res[i].second << ' '; cout << '\n'; } return 0; From f9e35555ec9fc2b408f4f5d885d723bae834ee42 Mon Sep 17 00:00:00 2001 From: GitHub Date: Thu, 26 Feb 2026 19:53:39 +0000 Subject: [PATCH 06/10] [auto-verifier] verify commit 36770a6bce59c44e6e0eb48e10a8616dd343d08e --- .verify-helper/timestamps.remote.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index 51d1be76..28d6ed7e 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -63,8 +63,8 @@ "tests/library_checker_aizu_tests/graphs/dijkstra_lib_checker.test.cpp": "2025-08-14 10:27:46 -0600", "tests/library_checker_aizu_tests/graphs/directed_cycle.test.cpp": "2026-01-17 13:05:42 -0700", "tests/library_checker_aizu_tests/graphs/enumerate_triangles.test.cpp": "2025-08-06 16:18:37 -0600", -"tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp": "2026-02-26 12:48:27 -0700", -"tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp": "2026-02-26 12:48:27 -0700", +"tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp": "2026-02-26 12:51:30 -0700", +"tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp": "2026-02-26 12:51:30 -0700", "tests/library_checker_aizu_tests/graphs/hopcroft_karp_aizu.test.cpp": "2025-12-11 21:47:53 +0000", "tests/library_checker_aizu_tests/graphs/hopcroft_karp_lib_checker.test.cpp": "2025-12-11 21:47:53 +0000", "tests/library_checker_aizu_tests/graphs/mst.test.cpp": "2026-01-22 10:08:22 -0700", From f920eba22e66250a118c74474b61ea95a0ec974b Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Thu, 26 Feb 2026 13:17:25 -0700 Subject: [PATCH 07/10] add docs now --- library/graphs/euler_walk.hpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/library/graphs/euler_walk.hpp b/library/graphs/euler_walk.hpp index 083191b8..374d4108 100644 --- a/library/graphs/euler_walk.hpp +++ b/library/graphs/euler_walk.hpp @@ -1,4 +1,16 @@ #pragma once +//! @code +//! vector>> adj(n); +//! rep(i, 0, m) { +//! int u, v; +//! cin >> u >> v; +//! u--, v--; +//! adj[u] += {v, i}; +//! } +//! vector path = euler_walk(adj, m, s); +//! @endcode +//! @time O(n + m) +//! @space O(n + m) vector euler_walk(auto& adj, int m, int s) { vi vis(m); vector path; From 1b953c76e332ad01940061967bef5d2fb69a15fe Mon Sep 17 00:00:00 2001 From: GitHub Date: Thu, 26 Feb 2026 20:19:25 +0000 Subject: [PATCH 08/10] [auto-verifier] verify commit f920eba22e66250a118c74474b61ea95a0ec974b --- .verify-helper/timestamps.remote.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index 28d6ed7e..97843eb4 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -63,8 +63,8 @@ "tests/library_checker_aizu_tests/graphs/dijkstra_lib_checker.test.cpp": "2025-08-14 10:27:46 -0600", "tests/library_checker_aizu_tests/graphs/directed_cycle.test.cpp": "2026-01-17 13:05:42 -0700", "tests/library_checker_aizu_tests/graphs/enumerate_triangles.test.cpp": "2025-08-06 16:18:37 -0600", -"tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp": "2026-02-26 12:51:30 -0700", -"tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp": "2026-02-26 12:51:30 -0700", +"tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp": "2026-02-26 13:17:25 -0700", +"tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp": "2026-02-26 13:17:25 -0700", "tests/library_checker_aizu_tests/graphs/hopcroft_karp_aizu.test.cpp": "2025-12-11 21:47:53 +0000", "tests/library_checker_aizu_tests/graphs/hopcroft_karp_lib_checker.test.cpp": "2025-12-11 21:47:53 +0000", "tests/library_checker_aizu_tests/graphs/mst.test.cpp": "2026-01-22 10:08:22 -0700", From d95bedcb7517c92164f4d381558ed78cd075567d Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Thu, 26 Feb 2026 13:27:17 -0700 Subject: [PATCH 09/10] renaming --- library/graphs/{euler_walk.hpp => euler_path.hpp} | 4 ++-- .../graphs/euler_walk_directed.test.cpp | 4 ++-- .../graphs/euler_walk_undirected.test.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename library/graphs/{euler_walk.hpp => euler_path.hpp} (85%) diff --git a/library/graphs/euler_walk.hpp b/library/graphs/euler_path.hpp similarity index 85% rename from library/graphs/euler_walk.hpp rename to library/graphs/euler_path.hpp index 374d4108..f7a1edf6 100644 --- a/library/graphs/euler_walk.hpp +++ b/library/graphs/euler_path.hpp @@ -7,11 +7,11 @@ //! u--, v--; //! adj[u] += {v, i}; //! } -//! vector path = euler_walk(adj, m, s); +//! vector path = euler_path(adj, m, s); //! @endcode //! @time O(n + m) //! @space O(n + m) -vector euler_walk(auto& adj, int m, int s) { +vector euler_path(auto& adj, int m, int s) { vi vis(m); vector path; auto dfs = [&](auto&& self, int u, int eu) -> void { diff --git a/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp b/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp index e1f7246e..92233f2a 100644 --- a/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp +++ b/tests/library_checker_aizu_tests/graphs/euler_walk_directed.test.cpp @@ -1,7 +1,7 @@ #define PROBLEM \ "https://judge.yosupo.jp/problem/eulerian_trail_directed" #include "../template.hpp" -#include "../../../library/graphs/euler_walk.hpp" +#include "../../../library/graphs/euler_path.hpp" int main() { cin.tie(0)->sync_with_stdio(0); int t; @@ -31,7 +31,7 @@ int main() { auto it = ranges::find(deg, 1); if (it != end(deg)) s = it - begin(deg); else if (s == -1) s = 0; - vector res = euler_walk(adj, m, s); + vector res = euler_path(adj, m, s); if (ssize(res) != m + 1) { cout << "No" << '\n'; continue; diff --git a/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp b/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp index 3b189b90..8de78f92 100644 --- a/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp +++ b/tests/library_checker_aizu_tests/graphs/euler_walk_undirected.test.cpp @@ -1,7 +1,7 @@ #define PROBLEM \ "https://judge.yosupo.jp/problem/eulerian_trail_undirected" #include "../template.hpp" -#include "../../../library/graphs/euler_walk.hpp" +#include "../../../library/graphs/euler_path.hpp" int main() { cin.tie(0)->sync_with_stdio(0); int t; @@ -28,7 +28,7 @@ int main() { auto it = ranges::find(deg, 1); if (it != end(deg)) s = it - begin(deg); else if (s == -1) s = 0; - vector res = euler_walk(adj, m, s); + vector res = euler_path(adj, m, s); if (ssize(res) != m + 1) { cout << "No" << '\n'; continue; From f67a014cfb253a0011e18a0f639fcaf925685c1e Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Thu, 26 Feb 2026 13:28:35 -0700 Subject: [PATCH 10/10] update --- library/graphs/euler_path.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/graphs/euler_path.hpp b/library/graphs/euler_path.hpp index f7a1edf6..ad9173b0 100644 --- a/library/graphs/euler_path.hpp +++ b/library/graphs/euler_path.hpp @@ -7,7 +7,7 @@ //! u--, v--; //! adj[u] += {v, i}; //! } -//! vector path = euler_path(adj, m, s); +//! vector path = euler_path(adj, m, source); //! @endcode //! @time O(n + m) //! @space O(n + m)