并查集(Union-Find Set):
一种用于管理分组的数据结构。它具备两个操作:(1)查询元素a和元素b是否为同一组 (2) 将元素a和b合并为同一组。
注意:并查集不能将在同一组的元素拆分为两组。
并查集的实现:
用树来实现。
使用树形结构来表示以后,每一组都对应一棵树,然而我们就可以将这个问题转化为树的问题了,我们看两个元素是否为一组我们只要看这两个元素的根是否一致。显然,使用树形结构将问题简单化了。合并时是我们只需要将一组的根与另一组的根相连即可。
并查集的核心在于,一棵树的所有节点根节点都为一个节点。使用Find函数查询时,也是查询到这个节点的根节点。
一行并查集:
int find(int x)
{
return p[x]==x? x:find(p[x]); //x的父节点保存在p[x]中,如果没有父节点则p[x]=x。
}
实现:
int node[i]; //每个节点
//初始化n个节点
void Init(int n){
for(int i = 0; i < n; i++){
node[i] = i;
}
}
//查找当前元素所在树的根节点(代表元素)
int find(int x){
if(x == node[x])
return x;
return find(node[x]);
}
//合并元素x, y所处的集合
void Unite(int x, int y){
//查找到x,y的根节点
x = find(x);
y = find(y);
if(x == y)
return ;
//将x的根节点与y的根节点相连
node[x] = y;
}
//判断x,y是属于同一个集合
bool same(int x, int y){
return find(x) == find(y)











