并查集模板

图解并查集

并查集的作用就是把一个数据集分成若干个子集,每个子集内部数据可以互联互通,而子集之间则不具有连通性。
并查集的底层结构类似于堆,也是用数组描述一种树结构,但不同的是,堆是一棵独立的二叉树,并查集的树是多叉树,而且可能不止一棵树(也就是森林)。
在并查集中,我们把相互独立的数据集称为连通分量,连通分量在逻辑上可以形象地描述为一棵树,每棵树都有一个根节点,其他的元素都会直接或间接指向根节点。

class UnionFind {
private:
    int count;
    vector<int> parent;
public:
    UnionFind(int n) : parent(n) {
        count=n;
        for (int i=0;i<n;i++) {
            parent[i]=i;
        }
    }

    /* 查找根节点 */
    int findRoot(int x) {
        if (x!=parent[x]) {
            parent[x]=findRoot(parent[x]);
        }

        return parent[x];
    }

    /* 合并操作 */
    void unionRoot(int x, int y) {
        int root_x=findRoot(x);
        int root_y=findRoot(y);
        if (root_x != root_y) {
            parent[root_x]=root_y;
            count--;
        }
    }

    /* 判断x,y是否属于同一连通分量 */
    bool isConnect(int x, int y) {
        return findRoot(x)==findRoot(y);
    }

    /* 返回连通分量个数 */
    int getCount() {
        return count;
    }
};
原文地址:https://www.cnblogs.com/hunter-w/p/15045000.html