并查集
并查集(Disjoint Set Union, DSU) 是一种用于管理元素分组的数据结构,主要支持以下两种操作:
查找(Find):确定某个元素属于哪个集合。
合并(Union):将两个集合合并为一个集合。
并查集常用于解决动态连通性问题,例如判断图中的两个节点是否连通,或者合并两个连通分量。
举个例子:
可以看《啊哈算法》的第200页的并查集内容
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <iostream> #include <vector>
using namespace std;
class UnionFind { private: vector<int> parent; public: UnionFind(int n) { parent.resize(n); for (int i = 0; i < n; i++) parent[i]=i; } int find(int x) { if (parent[x] != x) { parent[x] = find(parent[x]); } return parent[x]; } void unionSets(int x, int y) { parent[find(x)] = find(y); } bool isConnected(int x, int y) { return find(x) == find(y); } };
int main() { int n = 10; UnionFind uf(n); cout << uf.isConnected(1, 2) << endl; uf.unionSets(1, 2); cout << uf.isConnected(1, 2) << endl; return 0; }
|