java版本并查集代码实现
一、代码
public class DSU {
//自测,先将0和1合并,再将0和2合并
//实际操作步骤为:merge(0,1)将0父节点和1父节点合并,data[0]赋值为1,所以输出1,1,2,3,4
//merge(0,2)将data[0]的父节点1和2父节点合并,将data[data[0]]=data[2],所以输出1,2,2,3,4
public static void main(String[] args) {
initUnion(5);
merge(0,1);
for(int i=0;i<size;i++){
System.out.println(data[i]);
}
System.out.println("...........................");
merge(0,2);
for(int i=0;i<size;i++){
System.out.println(data[i]);
}
}
//基本的数据结构
static int[] data;
static int size;
//初始化集合
public static void initUnion(int initsize){
size=initsize;
data=new int[size];
for(int i=0;i<size;i++){
data[i]=i;
}
}
//找到1个集合的父节点
public static int find(int i){
if(data[i]!=i){
data[i]=find(data[i]);
}
return data[i];
}
//将1个集合的父节点和另1个集合的父节点合并,前者的父节点赋值为后者的父节点
public static void merge(int a, int b){
int fa=find(a);
int fb=find(b);
if(fa!=fb){
data[fa]=fb;
}
}
//判断2个集合是否归属同一个集合
public static boolean connect(int a, int b){
int fa=find(a);
int fb=find(b);
if(fa!=fb){
return false;
}
return true;
}
}
二、运行结果