一、查找根结点
递归查找结点x所在树根结点:
int Tree[N];
int findRoot(int x) {
if (Tree[x] == -1) return x;
else return findRoot(Tree[x]);
}
非递归查找结点x所在树根结点:
int Tree[N];
int findRoot(int x) {
int ret;
while (Tree[x] != -1)
x = Tree[x];
ret = x;
return ret;
}
递归查找结点x所在树根结点(添加路径优化):
int Tree[N];
int findRoot(int x) {
if (Tree[x] == -1) return x;
else {
int tmp = findRoot(Tree[x]);
Tree[x] = tmp;
return tmp;
}
}
非递归查找结点x所在树根结点(添加路径优化):
int Tree[N];
int findRoot(int x) {
int ret;
int tmp = x;
while (Tree[x] != -1)
x = Tree[x];
ret = x;
x = tmp;
while (Tree[x] != -1) {
int t = Tree[x];
Tree[x] = ret;
x = t;
}
return ret;
}
二、两个集合合并
int a, b;
a = findRoot(a);
b = findRoot(b);
if (a != b) {
Tree[a] = b;
}