const int N = 1e6+10;
int q[N];
// 封装了q[x]。
// 如果x已经是祖宗(所在集合的根节点),则返回自己,也就是祖宗
// 否则会通过迭代的方式修改父辈族谱(让所有父辈都成为祖宗的直接子节点),但仍是返回祖宗。
int find(int x){
if(x != q[x]) q[x] = find(q[x]) // 要修改父辈族谱,所以先调用find(q[x]),后给q[x]赋值。
return q[x];
}
// 将A所在的族谱并入B所在的族谱,不是只把A加入到B族谱。
void mergeA2B(int a, int b){
q[find(a)] = find(b); // 合并操作由祖宗执行,子孙没有资格参与家族之间的交互。
}
// 是否同一族谱。
bool isFamily(int a, int b){
return find(a)==find(b);
}
以前都没太懂,这一句请祖宗来 瞬间大彻大悟
感谢关注hhh,我也补充了内容
君不知汝字之妙,某沉醉