并查集是一种树形数据结构, 用于处理一些不交集的查询及合并问题
查找
如果要判断两人是否在同一家族,只要看两人的祖先是不是同一人就可以了。
int Maxn = 1e6 + 10;
int f[Maxn];//记录f[i]的父亲是谁,祖先的父亲是他自己
//初始化
void makeSet(int size)
{
for(int i=0;i<size;i++){
f[i] = i;
}
return ;
}
//递归查询
int find1(int x) //寻找x的祖先
{
if(f[x] == x)
{
return x; //如果x是祖先则返回
}
else
return find(f[x]);
}
//非递归查询
int find2(int x)
{
while(x != f[x]){
x = f[x];
}
return x;
}
路径压缩
int find3(int x)
{
if(x != f[x])
f[x] = find3(f[x]); //每个子孙都直接指向祖先,避免重复查询
return f[x];
}
合并
void unionSet(int x, int y)
{
x = find1(x);
y = find1(y);
f[x] = y; //把x的祖先变成y祖先的儿子
}