并查集——入门学习(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代码实现)的主要内容,如果未能解决你的问题,请参考以下文章