介绍

  • 实现集合的合并和查找
  • 用树来存储一个集合
  • 如果两个点有共同根,就在一个集合里
  • 合并只需要把一个点的根放到另一个点的根的下面就行

两种优化

按秩合并

  • 把矮的集合的根放到高的集合的根的下面
  • 总能保证深度不超过logn

路径压缩(简单常用)

  • 操作复杂度O(logn)
  • 忽视两个点的父子关系,只关心在哪个集合里
  • 在对一个点找根的时候同时将他的父亲变为根
int father[202020];//存储每个节点的父节点编号
int find(int x){
	return father[x]==x?x:father[x]=find(father[x]);
}
void merge(int x,int y){
	fa[find(x)]=find(y);//x的根接到y的根的下面
}