//并查集
const int maxn = 100000;
int N = 10;
int father[maxn];
//father[i]=i:父节点是自己,即i为根节点
//father[i]=j:i节点的父节点是j
//初始化。
void init() {
for (int i = 0; i <= N; i++) {
father[i] = i;
}
}
//查找
int findFather(int x) {
while (x != father[x]) {//不是根节点
x = father[x];//获取根节点
}
return x;
}
//递归查找
int findFatherD(int x) {
if (father[x] == x) return x;
else return findFatherD(father[x]);
}
//合并两个集合
void Union(int a, int b) {
int faA = findFather(a);//查找a的根节点
int faB = findFather(b);//查找b的
if (faA != faB) {
//不属于同一集合
father[faA] = faB;
}
}
//路径压缩,把同一个根节点的节点指向一个根节点
int findFatherAll(int x) {
int a = x;//暂存
while (x != father[x]) {
x = father[x];
}
//这里x是根节点了
while (a != father[a]) {
int z = a;
a = father[a];
father[z] = x;//将之前节点a的父节点改为根节点x
}
return x;
}
并查集原理和操作
猜你喜欢
转载自blog.csdn.net/weixin_42189888/article/details/106602974
今日推荐
周排行