并查集作用:
1.判断两节点是否联通
2.连接两个节点,使之联通
并查集数据结构:
多路树结构
例:
存储结构:
数组模拟:设数组为pre[i]
i为当前节点,pre[i]则为i节点所指向的父节点
那么判断两个节点是否联通就可以判断两节点的最终指向的父节点是否一样。
联通两个并查集,也变得很简单,两个并查集的最终父节点肯定是不同的,那么连接两个并查集就可以只要将其中一个并查集的最终父节点指向另一个并查集的父节点。
最终代码如下:
package 并查集;
import java.util.Scanner;
public class Main {
public static final int NUMBER = 1000;
//pre代表,此下标 i 的父节点下标为 pre[i]
static int pre[] = new int[NUMBER+5];
//初始化父节点为自己本身
public static void initPre(){
for(int i=0;i<=NUMBER;++i)
pre[i]=i;
}
//找出最大父节点,并更新节点
public static int findSet(int x){
int p = x;
while(pre[p]!=p) p=pre[p];
//此时找出的p就是x的最大父节点
int r;
//更新x的父节点
while(x!=p){
r = pre[x];
pre[x] = p;
x = r;
}
return p;
}
//判断是否是在一个并查集上
public static boolean isSameSet(int x,int y){
int fx = findSet(x);
int fy = findSet(y);
return fx==fy ? true:false;
}
//连接两个并查集
public static void unionSet(int x,int y){
int fx = findSet(x);
int fy = findSet(y);
//连接两个并查集
if(fx!=fy){
pre[fy]=fx;
}
}
public static void main(String[] args) {
}
}