并查集
并查集是什么?
查询(Find): 判断对象是否在同一个集合中
合并(Union): 元素所属集合
有联系、有关系
通过改变元素的父亲节点,将元素所在的集合构造成树
将树的根节点视作代表元,其余所有节点都是根节点(代表元)的儿子(节点)
擅长做的事情: 判断多个元素是否有关系
实现:
需要一个数组f来判断元素所属的集合(初始化为自己即 f [ i ] = i f[i]=i f[i]=i)
合并集合:
查找每个节点的父亲节点(递归调用):
int x=find(a)
int y=find(b);
f [ x ] = y f[x]=y f[x]=y
递归出口:自己的父亲是自己(自己是代表元)
(注意可能会 T L E TLE TLE)!!
并查集查找父亲代码:
int findfather(int x)
{
if(x==f[x])
{
return x;
}
else
{
f[x]=findfather(x);
return findfather(f[x]);
}
}