并查集
并查集的基本操作有三个:
- 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]++; }}

浙公网安备 33010602011771号