Codeforces
CF Step
Youtube Linkedin Discord Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Code : Incremental Even-Weighted Cycle Queries

class Solution {
  public:
    int numberOfEdgesAdded(int n, vector<vector<int>> &edges) { return 0; }
};
class Solution {
    int find(int x, vector<int> &parent, vector<int> &xr) {
        if (parent[x] == x)
            return x;
        int p = parent[x];
        parent[x] = find(parent[x], parent, xr);
        xr[x] ^= xr[p];
        return parent[x];
    }

  public:
    int numberOfEdgesAdded(int n, vector<vector<int>> &edges) {
        vector<int> parent(n), xr(n, 0), rnk(n, 0);
        for (int i = 0; i < n; ++i)
            parent[i] = i;
        int added = 0;
        for (const auto &e : edges) {
            int u = e[0], v = e[1], w = e[2];
            int ru = find(u, parent, xr);
            int rv = find(v, parent, xr);
            if (ru == rv) {
                if ((xr[u] ^ xr[v]) == w)
                    ++added;
                continue;
            }
            if (rnk[ru] < rnk[rv]) {
                parent[ru] = rv;
                xr[ru] = xr[u] ^ xr[v] ^ w;
            } else if (rnk[ru] > rnk[rv]) {
                parent[rv] = ru;
                xr[rv] = xr[u] ^ xr[v] ^ w;
            } else {
                parent[rv] = ru;
                xr[rv] = xr[u] ^ xr[v] ^ w;
                ++rnk[ru];
            }
            ++added;
        }
        return added;
    }
};