并查集的模板都大致相同,做了一题并查集就顺便总结一下学到的东西。
代码:
//记录父节点的数组初始化
void resum(int n) {
for (int i = 0; i < n; i++) {
fcode[i] = i;
};
}
//查询根节点顺便做路径压缩
int findf(int a) {
int f = a;
while (f != fcode[f]) {
f = fcode[f];
};
//压缩路径
while (fcode[a] != f) {
int x = fcode[a];//记录a的直属下一节点
fcode[a] = f;//将a的下一节点改为根节点
a = x;//准备下一轮压缩
};
return f;
}
//合并
int bcj(int n, int m) {
int fa = findf(road[i][0]);
int fb = findf(road[i][1]);
fcode[fb] = fa;
}
并查集只为了查询数a和b是否属于同一连通块,压缩并查集路线只为了查找更快更便捷,并不关心其内部结构。