首页 > 其他分享 >并查集

并查集

时间:2023-06-26 11:45:35浏览次数:23  
标签:int 查集 Find rootY rootX root public

public class UnionFind
{
    // i的根节点时root[i]
    private int[] root;

    public UnionFind(int size)
    {
        root = new int[size];
        for(int i = 0; i < size; i++)
        {
            root[i] = i;
        }
    }

    public void Union(int x, int y)
    {
        int rootX = Find(x);
        int rootY = Find(y);
        if(rootX != rootY)
            root[rootX] = rootY;
    }

    public int Find(int x)
    {
        if(x == root[x])
            return root[x];
        return Find(root[x]);
    }
}

优化:

public class UnionFind
{
    // i的根节点时root[i]
    private int[] root;
    private int[] rank;

    public UnionFind(int size)
    {
        root = new int[size];
        for(int i = 0; i < size; i++)
        {
            root[i] = i;
            rank[i] = 0;
        }
    }

    public void Union(int x, int y)
    {
        int rootX = Find(x);
        int rootY = Find(y);
        if(rootX != rootY)
            root[rootX] = rootY;
    }

    public int Find(int x)
    {
        if(x == root[x])
            return root[x];
        return Find(root[x]);
    }

    public int QuickFind(int x)
    {
        if(x == root[x])
            return root[x];
        root[x] = Find(root[x]);
        return root[x];
    }
    // 比较两个树的高,矮的连到高的上面
    public void QuickUnion(int x, int y)
    {
        int rootX = QuickFind(x);
        int rootY = QuickFind(y);
        if(rootX != rootY)
        {
            if(rank[rootX] > rank[rootY])
            {
                root[rootY] = rootX;
            }
            else if(rank[rootX] < rank[rootY])
            {
                root[rootX] = rootY;
            }
            else
            {
                root[rootY] = rootX;
                rank[rootX]++;
            }
        }
    }
}

 

标签:int,查集,Find,rootY,rootX,root,public
From: https://www.cnblogs.com/anlingxiao/p/17505232.html

相关文章

  • 并查集的具体应用 CF1213G CF444E [HNOI2005]狡猾的商人
    每当我们看到“最大值最小”“路径上的最大最小值”等字眼时,我们就可以考虑并查集。我们可以尝试把这些问题转化为某种意义上按单调顺序的合并,利用并查集求解答案。以下时两例并查集的巧妙应用。CF1213GPathQueries注意“最大权值不大于q”,加上允许离线,我们可以把边按照权值......
  • abc049d <并查集>
    https://atcoder.jp/contests/abc049/tasks/arc065_b//https://atcoder.jp/contests/abc049/tasks/arc065_b//使用两个并查集维护连通关系//求并集,使用每个并查集的祖宗节点组成的pair表示这个交集#include<iostream>#include<algorithm>#include<map>usingnames......
  • 并查集
    并查集模板: #include<bits/stdc++.h>#defineMaxsize100005//只需要改这里就可以usingnamespacestd;intfa[Maxsize],rankk[Maxsize];inlinevoidinit(intn)//初始化{for(inti=1;i<=n;++i){fa[i]=i;rankk[i]=1;}}intfind(intx)/......
  • HDU 3277 Marriage Match III(并查集+二分+最大流)
    题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢?一开始我想每个女孩连喜欢的男孩,而且选K个不喜欢的男孩也连边,可是这K个要怎么确定呢?这种显然......
  • HDU 3081 Marriage Match II(二分+并查集+最大流)
    题意:有N个女孩要与N个男孩玩配对游戏.每个女孩有一个可选男孩的集合(即该女孩可以选自己集合中的任意一个男孩作为该轮的搭档).然后从第一轮开始,每个女孩都要和一个不同的男孩配对.如果第一轮N个女孩都配对成功,那么就开始第二轮配对,女孩依然从自己的备选男孩集合中选择,但是不能......
  • HDU - 2473 (并查集+设立虚父节点(马甲))
    涉及到并查集的删除操作,比较复杂,可以利用虚设父节点的方法:例如:有n个节点,进行m次操作.首先将0~n-1的节点的父节点设置为i+n,n~2n+1的节点的父节点设置为本身,有m次操作,所以要用到m个虚节点,例如0,1,2,3,4,5的父节点为7,8,9,10,11,把他们插入2的集合,所以他们的根节点都为8,当把2从集合......
  • 数据结构与算法分析(Java语言描述)(24)—— 并查集的路径压缩
    packagecom.dataStructure.union_find;//我们的第五版Union-FindpublicclassUnionFind5{//rank[i]表示以i为根的集合所表示的树的层数//在后续的代码中,我们并不会维护rank的语意,也就是rank的值在路径压缩的过程中,有可能不在是树的层数值//这也是......
  • POJ2236(并查集)
    题目:http://poj.org/problem?id=2236 题意:给定n个点的坐标,然后选出其中的一些点出来,问在这些点中的指定的两点是否连通。#include<iostream>#include<string.h>#include<stdio.h>usingnamespacestd;constintN=1005;structPoint{intx,y;};Pointp[N];i......
  • UVALive - 6889[并查集+STL]
    题目链接:https://vjudge.net/contest/301219#problem/F 解题思路:枚举每个矩形的时候,看它是否需要和其他人合并只需要查看它的外形边框是否又被标记,这个可以直接用离散化,然后set存一下每个矩形四个格子,就可以用log(n)找到合并的矩形,然后后并查集并一下就好了。#include<bits/std......
  • hdu 3038(种类并查集)
    题目大意:有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的是矛盾的解题思路:这道题第一次接触很难往并查集方向去思考。这里使用的并查集很灵活,不仅仅要记录其父亲节点,同时还要记录该节点到父亲节点的总和。在更新时,[l,r]要变成[l-1,r],比如有区间[1,2],[3,4......