概念
主要用于解决元素分组的问题,主要有两种操作:
- 合并(Union):把两个不相交的集合合并为一个集合
- 查询(Find):查询两个元素是否在同一个集合中
过程
1.初始化
int fa[MAXN]; //储存父节点
inline void init(int n)
{
for (int i = 1; i <= n; ++i)
fa[i] = i; //一开始每个元素的父节点为自己
}
2.查询
路径压缩:把每个节点的父节点都设置为根节点
int find(int x)
{
if(x == fa[x])
return x;
else{
fa[x] = find(fa[x]); //父节点设为根节点**************
return fa[x]; //返回父节点
}
}
///化简版
int find(int x)
{
return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
3.合并
void merge(int x,int y)
{
int fx = find(x);
int fy = find(y);
if(fx != fy)
fa[fx] = fy;
}
化简版
void merge(int i, int j)
{
fa[find(i)] = find(j);
}