This documentation is automatically generated by competitive-verifier/competitive-verifier
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/eulerian_trail_undirected
#include <bits/stdc++.h>
#define PUSHB push_back
#define ALL(a) (a).begin(), (a).end()
using namespace std;
using pii = pair<int, int>;
#include "../../src/graph/euler.hpp"
void solve() {
int n, m;
cin >> n >> m;
map<pii, int> mp;
Euler euler(n);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
mp[{u, v}] = mp[{v, u}] = i;
euler.adde(u, v);
}
int resp = euler.work();
if (resp == -1) {
cout << "No\n";
} else {
cout << "Yes\n";
for (int i = 0; i <= m; i++) cout << euler.path[i] << " \n"[i == m];
for (int i = 0; i < m; i++) cout << euler.epath[i] << " \n"[i + 1 == m];
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int tt = 1;
cin >> tt;
while (tt--) {
solve();
}
return 0;
}
#line 1 "test/graph/euler.test.cpp"
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/eulerian_trail_undirected
#include <bits/stdc++.h>
#define PUSHB push_back
#define ALL(a) (a).begin(), (a).end()
using namespace std;
using pii = pair<int, int>;
#line 1 "src/graph/euler.hpp"
// 无向图欧拉回路或路径, 时间复杂度 $\mathcal{O}(n + m)$.
struct Euler {
int n, m = 0;
vector<char> used;
vector<int> cur_e, path, epath;
vector<vector<pii>> G;
Euler(int n) : n(n), cur_e(n), G(n) {}
void adde(int u, int v) { G[u].PUSHB({v, m}), G[v].PUSHB({u, m++}); }
int work() {
if (m == 0) return path.PUSHB(0), 0;
used.assign(m, 0);
vector<int> odd, even;
for (int i = 0; i < n; i++)
if (!G[i].empty()) G[i].size() & 1 ? odd.PUSHB(i) : even.PUSHB(i);
if (odd.size() == 1 || odd.size() > 2) return -1;
odd.empty() ? dfs(even[0]) : dfs(odd[0]);
reverse(ALL(path)), reverse(ALL(epath));
return int(path.size()) == m + 1 ? 0 : -1;
}
private:
void dfs(int u) {
for (int& i = cur_e[u]; i < int(G[u].size());) {
auto [v, e] = G[u][i++];
if (used[e]) continue;
used[e] = 1, dfs(v), epath.PUSHB(e);
}
path.PUSHB(u);
}
};
#line 9 "test/graph/euler.test.cpp"
void solve() {
int n, m;
cin >> n >> m;
map<pii, int> mp;
Euler euler(n);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
mp[{u, v}] = mp[{v, u}] = i;
euler.adde(u, v);
}
int resp = euler.work();
if (resp == -1) {
cout << "No\n";
} else {
cout << "Yes\n";
for (int i = 0; i <= m; i++) cout << euler.path[i] << " \n"[i == m];
for (int i = 0; i < m; i++) cout << euler.epath[i] << " \n"[i + 1 == m];
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int tt = 1;
cin >> tt;
while (tt--) {
solve();
}
return 0;
}
| Env | Name | Status | Elapsed | Memory |
|---|---|---|---|---|
| g++ | euler_tour_00 |
|
285 ms | 29 MB |
| g++ | euler_tour_01 |
|
289 ms | 30 MB |
| g++ | euler_tour_02 |
|
269 ms | 29 MB |
| g++ | euler_tour_03 |
|
287 ms | 28 MB |
| g++ | example_00 |
|
5 ms | 4 MB |
| g++ | example_01 |
|
5 ms | 4 MB |
| g++ | many_same_vertex_00 |
|
250 ms | 39 MB |
| g++ | many_same_vertex_01 |
|
270 ms | 41 MB |
| g++ | many_same_vertex_02 |
|
271 ms | 42 MB |
| g++ | max_random_00 |
|
67 ms | 8 MB |
| g++ | max_random_01 |
|
264 ms | 29 MB |
| g++ | max_random_02 |
|
353 ms | 42 MB |
| g++ | max_random_walk_00 |
|
95 ms | 18 MB |
| g++ | max_random_walk_01 |
|
267 ms | 38 MB |
| g++ | max_random_walk_02 |
|
417 ms | 51 MB |
| g++ | mid_random_00 |
|
96 ms | 5 MB |
| g++ | mid_random_01 |
|
97 ms | 4 MB |
| g++ | mid_random_02 |
|
98 ms | 5 MB |
| g++ | mid_random_walk_00 |
|
119 ms | 5 MB |
| g++ | mid_random_walk_01 |
|
115 ms | 5 MB |
| g++ | mid_random_walk_02 |
|
127 ms | 5 MB |
| g++ | small_random_00 |
|
57 ms | 4 MB |
| g++ | small_random_01 |
|
58 ms | 4 MB |
| g++ | small_random_02 |
|
58 ms | 4 MB |
| g++ | small_random_walk_00 |
|
72 ms | 4 MB |
| g++ | small_random_walk_01 |
|
71 ms | 4 MB |
| g++ | small_random_walk_02 |
|
71 ms | 4 MB |