并查集
功能
- 查询
- 合并
优化
- 路径压缩
- 避免退化:合并时候rank(高度)小的指向rank(高度)大的(有路径压缩就不用了)
模板
int par[MAX_N]
int size[MAX_N]
//初始化
for(int i = 0; i < n; i++){
par[i] = i;
//记录集合个数时候才用
size[i] = 1;
}
//查询
int find(int x){
if(par[x] == x) return x;
else return par[x] = find(par[x]);//路径压缩
}
//合并
void unite(int x, int y){
par[find(x)] = find(y);
//记录集合个数时候才用
size(find(x)) += size(find(y));
}
题目
- 990.等式方程的可满足性