并差集模板
int father[1003] = { 0 };//标记当前节点的父亲,注意father数组的初始化问题。
int depth[1003] = { 0 };//标记当前节点的深度,注意ra数组的初始化问题。
int find(int x) {//返回x最上面的父亲
return father[x] = father[x] == x ? x : find(father[x]);
/*
如果x的父亲是x,说明已经搜索到头了,返回father[x]就行;
如果x的父亲不是x,就让x的父亲等于x最上面的父亲(路径压缩)
这么做的好处就是:只要搜索过x,再次进行搜索的时候,就不用重新搜索,
只需要搜一次就行
father[x]记录的就不是x的父亲,而是x最上面的父亲。
*/
}
void meg(int x, int y) {//将x节点和y节点连接,更新father数组
int a = find(x), b = find(y);
if (depth[a] < depth[b]) {//判断a,b的度,度大的作为度小的父亲
father[a] = b;
}
else {
father[b] = a;
if (depth[a] == depth[b]) {
//如果两个节点的度相等,让a当做b的父亲,a的度加一
depth[a]++;
}
}
}
bool same(int x, int y) {
return find(x) == find(y);//找到a,b最上面的父亲,判断是否相等。
}