挑战程序设计竞赛(算法和数据结构)——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实现