并查集是一种用来管理数据分组状况的数据结构,可以进行合并操作,但无法进行分割。
并查集的结构
并查集也是用树形结构来实现的,但不是二叉树。每个数据,元素对应一个节点,每个组对应一棵树。
并查集的结构
并查集也是用树形结构来实现的,但不是二叉树。每个数据,元素对应一个节点,每个组对应一棵树。
并查集的实现
并查集有几个基本操作初始化、查询树的根、合并x,y所属集合、判断x,y是否属于同一集合。
查询是查询树的根节点,两个数的根有共同的根节点,说明两个数属于同一组。
合并就是将一个树的根向另一个树的根连边,两棵树就变成一棵,两个组就合并成一个组了。
为了使并查集更加高效,采用一种路径压缩的方法,每次查询之后,若这个节点能找到根节点,那么就将这个节点直接连接到根节点。
具体实现代码:
int par[MAX_N];//父亲结点
int rank[MAX_N];//树的高度
//初始化n个元素
void init(int n){
for(int i=0;i<n;i++){
par[i]=i;
rank[i]=0;
}
}
//查找根节点
int find(int x){
if(par[x]==x)
return par[x];
else
return par[x]=find(par[x]);
}
//合并X和Y所属的集合
void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y)
return;
if(rank[x]<rank[y]){
par[x]=y;
}
else{
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}
//判断两个节点是否属于同一集合
bool same(int x,int y){
if(find(x)==find(y))
return true;
else
return false;
}