并查集(Disjoint-Set)是一种可以维护若干个不重叠的集合。它的基本操作有两个:
GET 查询一个元素属于哪个集合
MERGE 合并两个集合成为一个集合,就是将其中一个父结点指向另一个父结点
在查询的过程中,我们可以利用回溯顺便将路径中所有元素指向父结点,这个操作称为路径压缩。
模板:
int fa[SIZE];
int get(int x){
if(x == fa[x]) return x;
else return fa[x] = get(fa[x]); //路径压缩
}
void merge(int x, int y){
fa[get(x)] = get(y);
return;
}