zoukankan      html  css  js  c++  java
  • 并查集模板

    图解并查集

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

    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;
        }
    };
    
  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/hunter-w/p/15045000.html
Copyright © 2011-2022 走看看