AtCoder-agc014_e.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct DSU {
  4. vector<int> parent;
  5. explicit DSU(int n) : parent(n) { iota(parent.begin(), parent.end(), 0); }
  6. int find(int x) { return parent[x] == x ? x : parent[x] = find(parent[x]); }
  7. };
  8. int main() {
  9. ios::sync_with_stdio(false);
  10. cin.tie(nullptr);
  11. int n;
  12. cin >> n;
  13. vector<unordered_map<int, int>> adjacent(n);
  14. auto add = [&](int u, int v, int bit) {
  15. adjacent[u][v] |= bit;
  16. adjacent[v][u] |= bit;
  17. };
  18. for (int i = 0; i < n - 1; ++i) {
  19. int u, v;
  20. cin >> u >> v;
  21. add(--u, --v, 1);
  22. }
  23. for (int i = 0; i < n - 1; ++i) {
  24. int u, v;
  25. cin >> u >> v;
  26. add(--u, --v, 2);
  27. }
  28. queue<pair<int, int>> ready;
  29. for (int u = 0; u < n; ++u) {
  30. for (auto [v, mask] : adjacent[u]) {
  31. if (u < v && mask == 3) ready.push({u, v});
  32. }
  33. }
  34. DSU dsu(n);
  35. int components = n;
  36. while (!ready.empty()) {
  37. auto [raw_u, raw_v] = ready.front();
  38. ready.pop();
  39. int u = dsu.find(raw_u), v = dsu.find(raw_v);
  40. if (u == v) continue;
  41. auto it = adjacent[u].find(v);
  42. if (it == adjacent[u].end() || it->second != 3) continue;
  43. if (adjacent[u].size() < adjacent[v].size()) swap(u, v);
  44. adjacent[u].erase(v);
  45. adjacent[v].erase(u);
  46. vector<pair<int, int>> moved(adjacent[v].begin(), adjacent[v].end());
  47. for (auto [raw_to, mask] : moved) {
  48. int to = dsu.find(raw_to);
  49. if (to == u || to == v) continue;
  50. adjacent[to].erase(v);
  51. int merged_mask = mask;
  52. auto old = adjacent[u].find(to);
  53. if (old != adjacent[u].end()) merged_mask |= old->second;
  54. adjacent[u][to] = merged_mask;
  55. adjacent[to][u] = merged_mask;
  56. if (merged_mask == 3) ready.push({u, to});
  57. }
  58. adjacent[v].clear();
  59. dsu.parent[v] = u;
  60. --components;
  61. }
  62. cout << (components == 1 ? "YES\n" : "NO\n");
  63. return 0;
  64. }