并查集核心代码
//find 函数
int pre[x] // 维护祖宗节点;
int d[x]// x 到pre[x]的权值;
int find(int x){
return x == pre[x]?:x:pre[x] == find(pre[x]);
}
//带权并查集find函数
int find(int x){
if(x != pre[x]){
int u = find(pre[x]);
d[x] += d[p[x]]; //d[x]的初始化根据题意,经典例题:食物链;
p[x] = u;
}
}
// 初始化,假定节点编号是1~n
for (int i = 1; i <= n; i ++ ) pre[i] = i // 维护size: size[i] = 1;
// 合并a和b所在的两个集合:
pre[find(a)] = find(b);
//维护集合内元素个数 size[x]; // x 为祖宗结点;
size[find(b)] += size[find(a)];
pre[find(a)] = find(b);