并查集的概念
并查集是通过将具有连接关系的元素合并成为一个组,这个组里面所有的元素有公共的祖先。
这样最终只会形成一个个小组的形式。这样对于很多分组问题都能得到很好的解决。
基本操作
init初始化
用来初始化fa数组,以及子数组的深度rank数组,初始化的时候会有n个组,每个组的根节点是本身,同时组内连接数深度都为1。
vector<int> fa;
vector<int> rank;
void init(int n)
{
for (int i = 0; i < n; i++)
{
fa[i] = i;
rank[i] = 1;
}
}
find操作
寻找组内元素的根节点,利用递归的思想直到寻找到fa[x] ==x为止。
int find(int x)
{
return fa[x] == x? x:(fa[x] = find(fa[x]));
}
merge操作
加入新的元素后进行合并到连接树种。
void merge(int i, int j)
{
int x = find(i);
int y = find(j);
if (rank[x] <= rank[y])
{
fa[x] = y;
}
else
{
fa[y] =x;
}
if (rank[x] == rank[y] && x != y)
{
rank[y]++
}
}
这里加入rank的目的是为了使得连接树的深度尽量低,使得查找的时候效率更高。