competitive-programing

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Astral-23/competitive-programing

:heavy_check_mark: potential dsu
(Datastructure/potential_dsu.hpp)

Verified with

Code

TT struct potential_dsu {
    using vi = vec<int>;
    using vvi = vec<vi>;
    vi par, sz, es;
    vec<T> h;
    int cc;
    int root;

    potential_dsu(int n, int ROOT) : root(ROOT) {
        par = vi(n);
        sz = vi(n, 1);
        es = vi(n, 0);
        cc = n;
        iota(all(par), 0);

        h = vec<T>(n, 0);
    }

    int leader(int u) {
        if(par[u] != u) {
            int r = leader(par[u]);
            h[u] += h[par[u]];
            return par[u] = r;
        }
        return u;
    }

    bool same(int a, int b) {
        return leader(a) == leader(b);
    }

    bool merge(int s, int t, T w) {// h[t] = h[s] + w 或いは s -> tに重みwの辺   
        w += weight(s), w -= weight(t);
        s = leader(s), t = leader(t);
        if(s == t) {
            es[s]++;
            return false;
        }

        if(sz[s] < sz[t] && s != root) {
            swap(s, t);
            w *= -1;
        }

        cc--;
        par[t] = s;
        sz[s] += sz[t];
        es[s] += es[t] + 1;

        h[t] = w;
        return true;
        
    }

    T weight(int v) {//根から見た vの値  p[根]は0。
        leader(v);
        return h[v];
    }

    T diff(int s, int t) {//sから見た tの値
        return weight(t) - weight(s);
    }

};

/*
@brief potential dsu
*/
#line 1 "Datastructure/potential_dsu.hpp"
TT struct potential_dsu {
    using vi = vec<int>;
    using vvi = vec<vi>;
    vi par, sz, es;
    vec<T> h;
    int cc;
    int root;

    potential_dsu(int n, int ROOT) : root(ROOT) {
        par = vi(n);
        sz = vi(n, 1);
        es = vi(n, 0);
        cc = n;
        iota(all(par), 0);

        h = vec<T>(n, 0);
    }

    int leader(int u) {
        if(par[u] != u) {
            int r = leader(par[u]);
            h[u] += h[par[u]];
            return par[u] = r;
        }
        return u;
    }

    bool same(int a, int b) {
        return leader(a) == leader(b);
    }

    bool merge(int s, int t, T w) {// h[t] = h[s] + w 或いは s -> tに重みwの辺   
        w += weight(s), w -= weight(t);
        s = leader(s), t = leader(t);
        if(s == t) {
            es[s]++;
            return false;
        }

        if(sz[s] < sz[t] && s != root) {
            swap(s, t);
            w *= -1;
        }

        cc--;
        par[t] = s;
        sz[s] += sz[t];
        es[s] += es[t] + 1;

        h[t] = w;
        return true;
        
    }

    T weight(int v) {//根から見た vの値  p[根]は0。
        leader(v);
        return h[v];
    }

    T diff(int s, int t) {//sから見た tの値
        return weight(t) - weight(s);
    }

};

/*
@brief potential dsu
*/
Back to top page