并查集
并查集
并查集是一种维护集合的数据结构,它的名字中并、查、集三个字分别取自合并(Union),查找(Find),集合(Set).也就是说,并查集支持下面两个操作:
- 合并
- 查找
那么并查集是用什么实现的呢?其实就是一个数组;
int father[MAXN];
其中father[i]表示i的父亲节点
初始化
一开始每个元素都是一个独立的集合,因此需要令所有father[i]=i;
void init(int *father, int n) { for (int i = 0; i < n; ++i) { father[i] = i; } }
查找(路径压缩)
int findFather(int x) { if (x == father[x]) return x; // x就是根节点 else { int F = findFather(x); father[x] = F;// 路径压缩 return F; } }
合并
int Union(int a, int b) { int Fa = findFather(a), Fb = findFather(b); if (Fa != Fb) father[Fb] = Fa; }