并查集——入门学习(java代码实现)

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集——入门学习(java代码实现)相关的知识,希望对你有一定的参考价值。

UnionSet.java

import java.util.Vector;

public class UnionSet 
    Vector<Integer> rank = new Vector<>();
    Vector<Integer> p = new Vector<>();

    public UnionSet(int size) 
        rank.setSize(size);
        p.setSize(size);

        for (int i=0;i<size;i++)makeSet(i);
    

    //初始化,将所有的rank初始化未0,类别p初始化为本身
    public void makeSet(int x)
        p.set(x, x);//p[index, element]
        rank.set(x, 0);
    

    public int findSet(int x)
        if(x!=p.elementAt(x))//p[x]表示x的类别,如果x被合并了,那么不断查找x=p[x]的类别即可
            p.set(x, findSet(p.elementAt(x)));
        
        return p.elementAt(x);
    

    //合并两个元素的本质是从顶部元素开始合并
    public void unite(int i, int j)
        int x = findSet(i);
        int y = findSet(j);

        //正常情况下是不需要改变rank的,除非合并的两个集合的rank是一样的
        if (rank.elementAt(x)>rank.elementAt(y))
            p.set(y, x);
        
        else if(rank.elementAt(x)<rank.elementAt(y))
            p.set(x, y);
        
        else 
            p.set(y, x);
            rank.set(x, rank.elementAt(x) + 1);
        
    


UnionSetDemo.java

import java.util.Scanner;

public class UnionSetDemo 
    public static void main(String[] args) 
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int q = cin.nextInt();

        //首先定义并查集(用Vector),初始化为n
        UnionSet ds = new UnionSet(n);

        //com表示查询的种类,0为unite,1为same;
        for (int i=0;i<q;i++)
            int com = cin.nextInt();
            int x = cin.nextInt();
            int y = cin.nextInt();

            //如果合并两个集合,就调用unite
            if(com==0)ds.unite(x, y);
            else if(com==1)
                int a = ds.findSet(x);
                int b = ds.findSet(y);
                System.out.println(a);
                System.out.println(b);
                if(a==b) System.out.println(1);
                else System.out.println(0);
            
        
    


输入输出:

5 12
0 1 4
0 2 3
1 1 2
>>> 0
1 3 4
>>> 0
1 1 4
>>> 1
1 3 2
>>> 1
0 1 3
1 2 4
>>> 1
1 3 0
>>> 0
0 0 4
1 0 2
>>> 1
1 3 0
>>> 1

以上是关于并查集——入门学习(java代码实现)的主要内容,如果未能解决你的问题,请参考以下文章

❤️数据结构入门❤️(2 - 5)- 并查集

并查集(Java实现)

图论入门-并查集

hdu1272并查集入门

并查集题目从入门到入土

并查集入门