Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <map>
- using namespace std;
- const int MAXN = 20000;
- map< pair< int, int>, pair<int, int> > kek;
- vector< pair<int, int> > g[MAXN], order[MAXN];
- vector<bool> used[MAXN];
- int deg[MAXN];
- vector<int> bad;
- int ind;
- void dfs(int v) {
- for (int i = 0; i < g[v].size(); i++) {
- int to = g[v][i].first;
- if (!used[v][i]) {
- used[v][i] = true;
- used[to][kek[make_pair(v, i)].second] = true;
- //cout << v + 1 << " " << i << ", " << to + 1 << " " << kek[make_pair(v, i)].second << endl;
- dfs(to);
- if (g[v][i].second) {
- ind++;
- } else
- order[ind].emplace_back(to, v);
- }
- }
- }
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- int n, m, x, y;
- cin >> n >> m;
- for (int i = 0; i < m; i++) {
- cin >> x >> y;
- x--, y--;
- g[x].emplace_back(y, 0);
- g[y].emplace_back(x, 0);
- kek[make_pair(x, g[x].size() - 1)] = make_pair(y, g[y].size() - 1);
- kek[make_pair(y, g[y].size() - 1)] = make_pair(x, g[x].size() - 1);
- used[x].push_back(false);
- used[y].push_back(false);
- deg[x]++;
- deg[y]++;
- }
- for (int i = 0; i < n; i++) {
- if (deg[i] & 1) bad.push_back(i);
- }
- for (int i = 0; i < bad.size(); i += 2) {
- g[bad[i]].emplace_back(bad[i + 1], 1);
- g[bad[i + 1]].emplace_back(bad[i], 1);
- kek[make_pair(bad[i], g[bad[i]].size() - 1)] = make_pair(bad[i + 1], g[bad[i + 1]].size() - 1);
- kek[make_pair(bad[i + 1], g[bad[i + 1]].size() - 1)] = make_pair(bad[i], g[bad[i]].size() - 1);
- used[bad[i]].push_back(false);
- used[bad[i + 1]].push_back(false);
- }
- dfs(0);
- /*for (int i = 0; i < ind + 1; i++) {
- for (auto &j : order[i])
- cout << j.first + 1 << " " << j.second + 1;
- cout << endl;
- }*/
- //cout << endl;
- cout << ind << endl;
- for (int i = 1; i < ind + 1; i++) {
- for (auto &j : order[i])
- cout << j.first + 1 << " ";
- if (i != ind or order[0].empty())
- cout << order[i][order[i].size() - 1].second + 1 << endl;
- }
- if (!order[0].empty()) {
- for (auto &j : order[0])
- cout << j.first + 1 << " ";
- cout << order[0][order[0].size() - 1].second + 1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement