可撤销并查集模板

struct DSU {
    vector<int> fa, sz, st;
    DSU(int n) {
        fa.resize(n);
        sz.assign(n, 1);
        iota(fa.begin(), fa.end(), 0);
    }
    int find(int x) {
        return fa[x] == x ? x : find(fa[x]);
    }
    void merge(int x, int y) { //合并函数
        x = find(x), y = find(y);
        if (x == y) return;
        if (sz[x] < sz[y]) swap(x, y);
        st.push_back(y), fa[y] = x, sz[x] += sz[y];
    }
    bool check(int x, int y) {
        x = find(x), y = find(y);
        return x == y;
    }
    void delet() { //删除栈顶边
        if (st.empty()) return;
        int y = st.back();
        st.pop_back();
        sz[fa[y]] -= sz[y], fa[y] = y;
    }
    void back(int t = 0) {
        while (st.size() > t) {
            delet();
        }
    } //删除到只剩t条边
    int size() {
        return st.size();
    }
};
posted @ 2025-05-14 17:10  Ke_scholar  阅读(18)  评论(0)    收藏  举报