并查集通过map 进行实现分组,c++
时间: 2024-09-07 13:01:37 浏览: 40
并查集是一种数据结构,用于处理一些不交集的合并及查询问题。它支持两种操作:
1. 查找(Find):确定某个元素属于哪个子集,可以用来确定两个元素是否属于同一子集。
2. 合并(Union):将两个子集合并成一个集合。
在C++中,我们可以通过map来实现并查集,map可以存储元素到其父节点的映射关系。初始化时,每个元素的父节点是它自己,表示它自成一个子集。当需要合并两个子集时,可以通过map找到两个子集中元素的根节点,并将一个根节点的父节点指向另一个根节点,从而完成合并。查找操作则是通过递归或循环的方式在map中查找当前元素的根节点。
以下是并查集使用map实现的一个简单示例:
```cpp
#include <iostream>
#include <map>
#include <vector>
using namespace std;
class UnionFind {
private:
map<int, int> parent;
public:
// 查找集合的根节点
int find(int x) {
if (parent.find(x) == parent.end()) {
parent[x] = x; // 初始化
}
if (x != parent[x]) {
parent[x] = find(parent[x]); // 路径压缩
}
return parent[x];
}
// 合并两个集合
void unionSets(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootY] = rootX; // 将一个集合的根节点指向另一个集合的根节点
}
}
};
int main() {
UnionFind uf;
uf.unionSets(1, 2);
uf.unionSets(2, 3);
cout << "元素1和3是否属于同一集合: " << (uf.find(1) == uf.find(3) ? "是" : "否") << endl;
return 0;
}
```
阅读全文