1
0

CodeForces-723E.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include <iostream>
  2. #include <utility>
  3. #include <vector>
  4. using namespace std;
  5. struct AdjEdge { int to, id; };
  6. int main() {
  7. ios::sync_with_stdio(false);
  8. cin.tie(nullptr);
  9. int tests;
  10. cin >> tests;
  11. while (tests--) {
  12. int n, m;
  13. cin >> n >> m;
  14. vector<vector<AdjEdge>> adj(n + 1);
  15. vector<int> degree(n + 1, 0);
  16. vector<pair<int, int>> original(m);
  17. vector<int> a, b;
  18. a.reserve(m + n); b.reserve(m + n);
  19. auto add_edge = [&](int u, int v) {
  20. int id = static_cast<int>(a.size());
  21. a.push_back(u); b.push_back(v);
  22. adj[u].push_back({v, id});
  23. adj[v].push_back({u, id});
  24. };
  25. for (int id = 0; id < m; ++id) {
  26. int u, v;
  27. cin >> u >> v;
  28. original[id] = {u, v};
  29. add_edge(u, v);
  30. ++degree[u]; ++degree[v];
  31. }
  32. int best = 0;
  33. for (int v = 1; v <= n; ++v) {
  34. if (degree[v] % 2 == 0) ++best;
  35. else add_edge(0, v);
  36. }
  37. vector<bool> used(a.size(), false);
  38. vector<size_t> cursor(n + 1, 0);
  39. vector<pair<int, int>> direction(m, {-1, -1});
  40. for (int start = 0; start <= n; ++start) {
  41. while (cursor[start] < adj[start].size() && used[adj[start][cursor[start]].id]) {
  42. ++cursor[start];
  43. }
  44. if (cursor[start] == adj[start].size()) continue;
  45. vector<int> st{start};
  46. while (!st.empty()) {
  47. int v = st.back();
  48. while (cursor[v] < adj[v].size() && used[adj[v][cursor[v]].id]) {
  49. ++cursor[v];
  50. }
  51. if (cursor[v] == adj[v].size()) {
  52. st.pop_back();
  53. continue;
  54. }
  55. AdjEdge e = adj[v][cursor[v]++];
  56. if (used[e.id]) continue;
  57. used[e.id] = true;
  58. if (e.id < m) direction[e.id] = {v, e.to};
  59. st.push_back(e.to);
  60. }
  61. }
  62. cout << best << '\n';
  63. for (auto [u, v] : direction) cout << u << ' ' << v << '\n';
  64. }
  65. }