- 合并(Union):把两个不相交的集合合并为一个集合。
- 查询(Find):查询两个元素是否在同一个集合中。
当然,这样的定义未免太过学术化,看完后恐怕不太能理解它具体有什么用。所以我们先来看看并查集最直接的一个应用场景:亲戚问题。
先给出亲戚问题的AC代码:
#include#define MAXN 5005 int fa[MAXN], rank[MAXN]; inline void init(int n) { for (int i = 1; i <= n; ++i) { fa[i] = i; rank[i] = 1; } } int find(int x) { return x == fa[x] ? x : (fa[x] = find(fa[x])); } inline void merge(int i, int j) { int x = find(i), y = find(j); if (rank[x] <= rank[y]) fa[x] = y; else fa[y] = x; if (rank[x] == rank[y] && x != y) rank[y]++; } int main() { int n, m, p, x, y; scanf("%d%d%d", &n, &m, &p); init(n); for (int i = 0; i < m; ++i) { scanf("%d%d", &x, &y); merge(x, y); } for (int i = 0; i < p; ++i) { scanf("%d%d", &x, &y); printf("%sn", find(x) == find(y) ? "Yes" : "No"); } return 0; }
C++中,“?”与“:”共同组成三目条件运算符(?:)
三目条件运算符(?:)使用例子如下:
x ? y:z;
上面的三目条件运算的规则是:先计算表达式x的值,若x为真,则整个三目运算的结果是表达式y的值;若x为假,则整个三目运算的结果是表达式z的值。
一般来说,一个并查集对应三个操作:
1、初始化( Init()函数 )
2、查找函数( Find()函数 )
3、合并集合函数( Join()函数 )



