Salvens

E

Aug 4th, 2023
804
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <vector>
  5. #include <array>
  6. #include <set>
  7. #include <map>
  8.  
  9. using namespace std;
  10.  
  11. #define int long long
  12. #pragma comment(linker,"/STACK:1000000000,1000000000")
  13.  
  14. const long long INF = 1e9 + 7;
  15. const int MAXN = 1e5 + 100;
  16. //const int N = 1e5 + 10;
  17. //const int MOD = 1e9 + 7;
  18.  
  19. int dp[MAXN][2];
  20. array<int, MAXN> best;
  21. vector<vector<int>> g;
  22. map<pair<int, int>, pair<int, int>> edges;
  23. map<pair<int, int>, int> pos;
  24.  
  25. void dfs(int v, int p) {
  26.     int mini = INF;
  27.     for (auto to: g[v]) {
  28.         if (to == p) continue;
  29.         dfs(to, v);
  30.         dp[v][0] += max(dp[to][0], dp[to][1]);
  31.         if (dp[to][1] - dp[to][0] < mini) {
  32.             mini = dp[to][1] - dp[to][0];
  33.             best[v] = to;
  34.         }
  35.     }
  36.     if (mini != INF) {
  37.         dp[v][1] = dp[v][0] - max(dp[best[v]][1], dp[best[v]][0]);
  38.         dp[v][1] += dp[best[v]][0] + 1;
  39.     } else {
  40.         dp[v][1] = 0;
  41.     }
  42. }
  43.  
  44. vector<pair<int, pair<int, int>>> ans;
  45.  
  46. void get_ans(int v, bool flag, int p = -1) {
  47.     if (flag && best[v] != -1) {
  48.         int x = min(v + 1, best[v] + 1), y = max(v + 1, best[v] + 1);
  49.         int x1 = edges[make_pair(x, y)].first, y1 = edges[make_pair(x, y)].second;
  50.         ans.emplace_back(make_pair(pos[make_pair(x1, y1)], make_pair(x1, y1)));
  51.     }
  52.     for (auto to: g[v]) {
  53.         if (to == p) continue;
  54.         if (flag && to == best[v]) {
  55.             get_ans(to, false, v);
  56.         } else {
  57.             if (dp[to][0] > dp[to][1]) {
  58.                 get_ans(to, false, v);
  59.             } else {
  60.                 get_ans(to, true, v);
  61.             }
  62.         }
  63.     }
  64. }
  65.  
  66. bool comp(const pair<int, pair<int, int>>& lhs, const pair<int, pair<int, int>>& rhs) {
  67.     return lhs.first < rhs.first;
  68. }
  69.  
  70. signed main() {
  71.     ios_base::sync_with_stdio(false);
  72.     cin.tie(nullptr);
  73.     cout.tie(nullptr);
  74.     int n, m;
  75.     cin >> n >> m;
  76.     g.resize(n);
  77.     for (int i = 0; i < m; ++i) {
  78.         int u, v;
  79.         cin >> u >> v;
  80.         pair<int, int> tmp = make_pair(min(u, v), max(u, v));
  81.         edges[tmp] = make_pair(u, v);
  82.         pos[tmp] = i;
  83.         --u, --v;
  84.         g[u].emplace_back(v);
  85.         g[v].emplace_back(u);
  86.     }
  87.  
  88.     best.fill(-1);
  89.     dfs(0, -1);
  90.  
  91.     ans.reserve(m);
  92.     if (dp[0][0] > dp[0][1]) {
  93.         get_ans(0, false, -1);
  94.     } else {
  95.         get_ans(0, true, -1);
  96.     }
  97.     cout << ans.size() << '\n';
  98.     sort(ans.begin(), ans.end(), comp);
  99.     for (int i = 0; i < (int)ans.size(); ++i) {
  100.         cout << ans[i].second.first << ' ' << ans[i].second.second << '\n';
  101.     }
  102. }
Advertisement
Add Comment
Please, Sign In to add comment