library2

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

View the Project on GitHub goodstudyqaq/library2

:warning: structure/union-find/weighted-union-find.hpp

Code

#include <bits/stdc++.h>

/*
带权并查集
http://oj.daimayuan.top/course/15/problem/719
*/

using namespace std;

template <typename T>
struct WeightedUnionFind {
    vector<int> f;
    vector<T> ws;

    WeightedUnionFind() {}
    WeightedUnionFind(int sz) : f(sz), ws(sz) {
        iota(f.begin(), f.end(), 0);
    }

    int find(int k) {
        if (f[k] == k) return k;
        int par = find(f[k]);
        ws[k] += ws[f[k]];
        return f[k] = par;
    }

    T weight(int t) {
        find(t);
        return ws[t];
    }

    bool unite(int x, int y, T w) {
        int fx = find(x);
        int fy = find(y);

        if (fx == fy) {
            return false;
        }

        ws[fx] = -ws[x] + w + ws[y];
        f[fx] = fy;
        return true;
    }
};
#line 1 "structure/union-find/weighted-union-find.hpp"
#include <bits/stdc++.h>

/*
带权并查集
http://oj.daimayuan.top/course/15/problem/719
*/

using namespace std;

template <typename T>
struct WeightedUnionFind {
    vector<int> f;
    vector<T> ws;

    WeightedUnionFind() {}
    WeightedUnionFind(int sz) : f(sz), ws(sz) {
        iota(f.begin(), f.end(), 0);
    }

    int find(int k) {
        if (f[k] == k) return k;
        int par = find(f[k]);
        ws[k] += ws[f[k]];
        return f[k] = par;
    }

    T weight(int t) {
        find(t);
        return ws[t];
    }

    bool unite(int x, int y, T w) {
        int fx = find(x);
        int fy = find(y);

        if (fx == fy) {
            return false;
        }

        ws[fx] = -ws[x] + w + ws[y];
        f[fx] = fy;
        return true;
    }
};
Back to top page