并查集

作者: 不再_犹豫 | 来源:发表于2020-08-13 09:04 被阅读0次
    int fa[MAXN];
    #初始化
    for (int i = 0; i <= n; ++i)
            fa[i] = i;
    #查找
    ###简单查找
    public int find(int x)
    {
        if(fa[x] == x)
            return x;
        else
            return find(fa[x]);
    }
    ###路径压缩查找
    public int find(int x)
    {
        if(x == fa[x])
            return x;
        else{
            fa[x] = find(fa[x]);  //父节点设为根节点
            return fa[x];         //返回父节点
        }
    }
    public int find(int x)
    {
        return x == fa[x] ? x : (fa[x] = find(fa[x]));
    }
    #合并
    ###普通合并
    public void merge(int i, int j)
    {
        fa[find(i)] = find(j);
    }
    ###按秩合并
    inline void merge(int i, int j)
    {
        int x = find(i), y = find(j);    //先找到两个根节点
        if (rank[x] <= rank[y])
            fa[x] = y;
        else
            fa[y] = x;
        if (rank[x] == rank[y] && x != y)
            rank[y]++;                   //如果深度相同且根节点不同,则新的根节点的深度+1
    }
    

    统计集合个数

    for(int i = 0;i < n;i++){
        if(fa[i] == i){
            ans++;
        }
    }
    

    统计集合最大值

    单独设置一个数组记录

    相关文章

      网友评论

          本文标题:并查集

          本文链接:https://www.haomeiwen.com/subject/hkcpdktx.html