并查集-Disjoint Set 和 图-Graph

待编辑
并查集是一种数据结构,常用于解决集合合并、查找根节点等论问题,包括去除无向中的重复边。在C++中,我们可以利用并查集来简化这个问题,因为并查集实际上是一个表示分治的数据结构,可以方便地对连接情况进行操作。 以下是一个简单的C++示例,如何使用并查集去重边: ```cpp #include <iostream> #include <vector> using namespace std; class DisjointSet { private: vector<int> parent; public: DisjointSet(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) { int rootX = find(x); int rootY = find(y); if (rootX != rootY) { parent[rootX] = rootY; } } }; // 去重边函数 void removeDuplicates(vector<pair<int, int>>& edges) { DisjointSet ds(edges.size()); for (auto& edge : edges) { if (ds.find(edge.first) != ds.find(edge.second)) { ds.unionSets(edge.first, edge.second); // 合并相同的顶点 } else { // 如果已经合并过,则认为这条边存在,跳过 continue; } } edges.erase(unique(edges.begin(), edges.end()), edges.end()); // 删除重复的边 } int main() { vector<pair<int, int>> graph = {{1, 2}, {1, 3}, {2, 3}, {3, 4}, {2, 4}, {4, 5}}; removeDuplicates(graph); for (const auto& edge : graph) { cout << "Edge: (" << edge.first << ", " << edge.second << ")" << endl; } return 0; } ``` 在这个例子中,我们首先创建一个`DisjointSet`对象,然后遍历输入的边,如果它们代表的是不同的集合(即根节点不同),我们就将它们合并到一起。最后,由于并查集中相同的根节点表示相同的集合,所以我们可以删除那些重复出现的边。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值