并查集
并查集的基本操作有三个:
- makeSet(s):建立一个新的并查集,其中包含 s 个单元素集合。
- unionSet(x, y):把元素 x 和元素 y 所在的集合合并,要求 x 和 y 所在的集合不相交,如果相交则不合并。
- find(x):找到元素 x 所在的集合的代表,该操作也可以用于判断两个元素是否位于同一个集合,只要将它们各自的代表比较一下就可以了
1.
const
int
MAXSIZE = 500;
int
uset[MAXSIZE];
void
makeSet(
int
size) {
for
(
int
i = 0;i < size;i++) uset[i] = i;
}
2.
2.1
int
find(
int
x) {
if
(x != uset[x]) uset[x] = find(uset[x]);
return
uset[x];
}
2.2
int
find(
int
x) {
int
p = x, t;
while
(uset[p] != p) p = uset[p];
while
(x != p) { t = uset[x]; uset[x] = p; x = t; }
return
x;
}
3.
void
unionSet(
int
x,
int
y) {
if
((x = find(x)) == (y = find(y)))
return
;
if
(rank[x] > rank[y]) uset[y] = x;
else
{
uset[x] = y;
if
(rank[x] == rank[y]) rank[y]++;
}
}