并查集
一、简介
并查集是一种树形的数据结构,可以想象成由一个元素散发出多个分支(我将该元素称树根节点),我们可以通过某一个元素找到其父节点,也可以将多个集合集合成一个大的集合。
如图
两个集合,其树根点分别为0和5。
父节点:例如1的父节点为0,3的父节点为2
二、主要操作
1.进行初始化
首先,我们使用一个数组来表示并查集,将每个节点初始化其父节点为本身,
例如,arr[1]=1; arr[2]=2;
2.进行赋值
我们用数组的下标来表示每个节点,其数组的值为该下标的父节点,
如上图:
0无父节点,arr[0]=0;
1父节点为0,arr[1]=0;
3.find函数
int find(int arr[],int x){
while(arr[x]!=x){
x=arr[x];
}
//当数组中的值与其下标不同时(即其父节点不是它本身->不是树根节点)
//进行循环,将其父节点的值给x,然后再次判断其是不是为树根节点
//若不是,继续向上找其父节点,判断是否为树根节点
//若是,则返回其树根节点下标
return x;
}
//定义查找树根节点函数
或者使用以下函数在数据较多时,消耗时间会更少
int find(int arr[],int x){
if(arr[x]==x) return x;//若节点的值为下标 ,返回下标
return find(arr,arr[x]);//反之,则查找其值,为其父节点下标
}
4.uion函数
void uion(int arr[],int i,int j){
int r1=find(arr,i);//找到i的树根节点
int r2=find(arr,j);//找到j的树根节点
if(r1!=r2) arr[r2]=r1;
//如果二者不相等,随意将其中一个集合的树根节点的父节点变为另一个集合的树根节点
}
//定义合并函数
其图解为