目录
并查集的作用
-
将两个集合合并
-
询问两个元素是否在一个集合当中
基本原理
每个集合用一颗树来表示,树根的编号就是整个集合的编号,每个结点存储它的父结点。比如:p[x] 表示 x 的父结点。
递归寻找某一元素的树根
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
p数组表示父结点,比如:p[x] 表示 x 的父结点。
当 p[x] == x 时,表示 x 的父节点是树根。
每次寻找一结点的树根,也就是询问这个结点的集合,都需要依次向上遍历,这里可以采取路径压缩,每次询问都将这一结点的父节点改为根结点。这样询问某一结点的树根(即询问该结点属于哪一集合),时间复杂度可以近似O(1)。
合并两个集合
给定两个元素 a、b;将这两个元素所在的集合合并。
p[find(a)] = find(b);
上面这一行代码表示:将a属于的集合的树根,链接到b属于的集合的树根下。
这样就达到了两个元素所属的集合合并。