This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define len(x) (int)(x).size()
#define range(i, x, y) for(int i=x; i<y; i++)
#define sws ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define vint vector<int>
#define vll vector<long long>
#define vstr vector<string>
#define ll long long
#define F first
#define S second
#define pb push_back
#define pf push_front
#define del(a, n) (a).erase(a.begin()+(n))
#define mp make_pair
#define all(a) (a.begin(), a.end())
const int N = 1e6 + 1;
const int M = 1e6 + 1;
const int MAX = 1e6 + 1;
using namespace std;
struct Edge {
int target, id;
Edge(int _target, int _id): target(_target), id(_id) {}
};
vector<Edge> adj[N];
bool used_edge[M];
list<int> euler_walk(int u) {
list<int> ans;
ans.push_back(u);
while (!adj[u].empty()) {
int v = adj[u].back().target;
int eid = adj[u].back().id;
adj[u].pop_back();
if (used_edge[eid]) continue;
used_edge[eid] = true;
u = v;
ans.push_back(u);
}
// for (auto it = ++ans.begin(); it != ans.end(); ++it) {
// auto t = euler_walk(*it);
// t.pop_back();
// ans.splice(it, t);
// }
// for(auto x : ans) cout << x << ' ';
return ans;
}
vint sol;
vint res;
bool dead[MAX];
bool vs[MAX];
void decompose(list<int> ans) {
stack<int> cur;
vector<vint> re;
for(auto u : ans) {
if(!vs[u]) {
cur.push(u);
vs[u] = 1;
}
else {
vint cyc;
while(vs[u]) {
cyc.pb(cur.top());
vs[cur.top()] = 0;
cur.pop();
}
for(auto x : cyc){
cout << x << " ";
}
cout << endl;
cur.push(u);
vs[u] = 1;
}
}
}
int main(){
sws
int n, m;
cin >> n >> m;
for(int i=0; i<m; i++){
int u, v;
cin >> u >> v;
adj[u].emplace_back(v, i);
adj[v].emplace_back(u, i);
}
list<int> ans = euler_walk(1);
decompose(ans);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |