danielvitor23

Indiana Jiang and the Temple of Kukulkan

Aug 23rd, 2023
1,607
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.14 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ii = pair<int, int>;
  4.  
  5. int n, m;
  6. vector<int> used, deg, s;
  7. vector<vector<ii>> gr;
  8. vector<set<ii>> gr2;
  9.  
  10. set<ii> st;
  11. void create_spanning_tree(int u, int p = -1) {
  12.   used[u] = true;
  13.   deg[u] = p == -1 ? 0 : 1;
  14.   for (auto [to, idx] : gr[u]) if (!used[to]) {
  15.     gr2[u].insert({to, idx});
  16.     gr2[to].insert({u, idx});
  17.     ++deg[u];
  18.     create_spanning_tree(to, u);
  19.   }
  20.   // cout << u+1 << ' ' << deg[u] << '\n';
  21.   if (s[u]) {
  22.     st.insert({deg[u], u});
  23.   }
  24. }
  25.  
  26. int main() {
  27.   cin.tie(0)->sync_with_stdio(0);
  28.  
  29.   cin >> n >> m;
  30.  
  31.   gr.assign(m, vector<ii>());
  32.   gr2.assign(m, set<ii>());
  33.  
  34.   vector<ii> edges;
  35.   for (int i = 0; i < n; ++i) {
  36.     int a, b; cin >> a >> b, --a, --b;
  37.     edges.push_back({min(a, b), max(a, b)});
  38.     gr[a].push_back({b, i});
  39.     gr[b].push_back({a, i});
  40.   }
  41.  
  42.   s.assign(m, 0);
  43.   for (int i = 0; i < m; ++i) {
  44.     cin >> s[i];
  45.   }
  46.  
  47.   vector<int> ans;
  48.   deg.assign(m, 0);
  49.   used.assign(m, false);
  50.   for (int i = 0; i < m; ++i) {
  51.     if (!used[i]) {
  52.       st.clear();
  53.  
  54.       // cout << "STARTING:\n";
  55.       create_spanning_tree(i);
  56.       // cout << "FINISHING\n";
  57.  
  58.       if (st.size() % 2 == 1) {
  59.         cout << -1 << '\n';
  60.         return 0;
  61.       }
  62.  
  63.       while (!st.empty()) {
  64.         auto [dg, u] = *st.begin();
  65.         // cout << u+1 << " = " << dg << '\n';
  66.         st.erase({dg, u});
  67.         if (dg == 1) {
  68.           auto [to, idx] = *gr2[u].begin();
  69.           ans.push_back(idx);
  70.           s[u] = 1 - s[u];
  71.           s[to] = 1 - s[to];
  72.           --deg[to];
  73.           gr2[to].erase({u, idx});
  74.           if (s[to]) {
  75.             st.insert({deg[to], to});
  76.           } else {
  77.             st.erase({1+deg[to], to});
  78.           }
  79.         } else {
  80.           break;
  81.         }
  82.       }
  83.     }
  84.   }
  85.   for (int i = 0; i < m; ++i) {
  86.     // cout << s[i] << ' ';
  87.     if (s[i]) {
  88.       cout << -1 << '\n';
  89.       return 0;
  90.     }
  91.   } // cout << '\n';
  92.   sort(ans.begin(), ans.end());
  93.   ans.erase(unique(ans.begin(), ans.end()), ans.end());
  94.   cout << ans.size() << '\n';
  95.   for (auto a : ans) {
  96.     cout << a+1 << ' ';
  97.   }
  98.   cout << '\n';
  99. }
Advertisement
Add Comment
Please, Sign In to add comment