并查集种数据结构用来表示集合信息,用以实现如确定某个集合含有哪些元素、判断某两个元素是否存在同一个集合中、求集合中元素的数量等问题。
其内部用一颗树来实现,其中每个结点记录其父节点编号,根节点的父节点编号为-1,
【例】
1 | 2 | 3 | 4 |
3 | -1 | 2 | 2 |
判断两个元素是否处于同一棵树时可以判断其根节点是否相同,若相同则处于同一集合
对于集合A,B的合并,我们使树B的根节点指向A的根节点作为A的孩子之一。
同时为了节省查找时间,我们对其进行优化,使查找中尽量多的结点指向根节点,这样会极大地缩短查找时间
具体代码如下
查找函数(迭代+优化)
int Tree[N];
int findRoot(int x) {
int ret;
int tmp = x;
while (Tree[x] != -1)
x = Tree[x];
ret = x;
x = tmp;
while (Tree[x] != -1) {
int t = Tree[x];
Tree[x] = ret;
x = t;
}
return ret;
}
树的合并
a = findRoot(a);
b = findRoot(b);
if (a != b) Tree[a] = b;