在一些有N个元素的集合问题中,开始时通常让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中,可以用并查集来描述,其是树形结构。
操作步骤
- 初始化:把给个点所在的集合初始化为自身
void init(){ for(int i=0; i<n; i++){ father[i] = i; } }
- 查找:查找元素所在集合
int find(int x){ int r = x; while(father[r] != r){ r = father[r]; } // 进行路径压缩,减少树的深度 int i=x, j; while(father[i] != i){ j = father[i]; father[i] = r; i = j; } return r; }
- 合并:将两个元素所在集合进行合并
void union(int i, int j){ x = find(i); y = find(j); if(x!=y){ father[x] = y; } }