挑战程序设计竞赛(算法和数据结构)——14.1互质的集合(并查集)的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——14.1互质的集合(并查集)的JAVA实现相关的知识,希望对你有一定的参考价值。

题目与思路:



代码:

import java.util.Scanner;
import java.util.Vector;

public class DisjointSet 
    public static void main(String[] args) 
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int q = cin.nextInt();
        
        //首先定义并查集(用Vector),初始化为n
        UnionFindTree ds = new UnionFindTree(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)
                if(ds.same(x, y)) System.out.println(1);
                else System.out.println(0);
            
        

    

    static class UnionFindTree
        Vector<Integer> rank= new Vector<>();
        Vector<Integer> p= new Vector<>();
        
        
        //构造函数有无参构造和带参构造
        UnionFindTree()
        //带参构造 输入为容器尺寸
        UnionFindTree(int size)
            rank.setSize(size);//rank用于存放排名
            p.setSize(size);//p用于存放属于哪一个类
            //初始化
            for(int i=0;i<size;i++)makeSet(i);
        

        public void makeSet(int x)
            //将所有的rank初始化为0,将所有的p初始化为本身
            p.set(x, x);
            rank.set(x, 0);
        

        public boolean same(int x, int y)
            return findSet(x) == findSet(y);
        

        public int findSet(int x)
            if(x!=p.elementAt(x))//如果x的集合被合并了,那么p[x]的值就代表x当前属于第p[x]类,而p[x]值本身又代表属于一个类的头节点
                p.set(x,findSet(p.elementAt(x)));//那么就将头节点的值赋给p[x](也许没用??)
            
            return p.elementAt(x);//返回p[x]
        
        
        public void unite(int x, int y)
            //合并两个集合
            //将两个数所属的类别的头节点拿出来比较
            link(findSet(x), findSet(y));
        

        public void link(int x, int y)
            if(rank.elementAt(x)>rank.elementAt(y))//如果x的rank更大一些,那就把x的头节点的值赋给y(rank大,说明类大一些)
                p.set(y, x);
            
            else 
                p.set(x, y);//否则就会把y的头节点赋给x
                if(rank.elementAt(x)==rank.elementAt(y))//如果xy本身同属一类
                    rank.set(y,rank.elementAt(y)+1);//那么就让y的rank+1
                
            
        
    


输入输出:

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

以上是关于挑战程序设计竞赛(算法和数据结构)——14.1互质的集合(并查集)的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现

挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现