作用:
1.将两个集合合并 2.询问两个元素是否在一个集合当中
基本原理:
每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点存储了它的父节点,p[x]表示x的父节点。
关键问题:
1.如何判断树根:if(p[x] == x)
2.如何求x的集合编号:while(p[x] != x)x = p [x];
3.如何合并两个集合,他们的编号分别是p[x],p[y]:p[x] = y
4.优化:路径压缩
const int N = 100010;
int p[N];
int n, m;
int find(int x)//查找父节点+路径压缩
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}