并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
并查集
什么是并查集
通常开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大。
常见两种操作:
- 合并集合
- 查找某个元素属于哪个集合
查询根节点:
int find(int x)
{
int r = x;
while (f[r] != r)
r = f[r];
return r;
}
合并集合
void merge(int x,int y)
{
int fx,fy;
fx = findx(x);
fy = findx(y);
if(fx != fy)
f[fx] = fy;
}
利用相同集合合并后,来查找他们的祖先是不是同一个,如果是的话表示是同个节点,否则为不同。
如果查找有几个不同的节点,只需要判断F[i]的值是否为i的情况。