以下是一个不使用malloc的并查集算法,用于查找环的示例代码:
#include
#include
using namespace std;
class UnionFind {
private:
vector parent;
vector rank;
public:
UnionFind(int n) {
parent.resize(n);
rank.resize(n, 0);
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 unite(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) {
// x and y are already in the same set
return;
}
if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
}
};
bool hasCycle(vector>& edges) {
int n = edges.size();
UnionFind uf(n);
for (int i = 0; i < n; i++) {
int x = edges[i][0];
int y = edges[i][1];
if (uf.find(x) == uf.find(y)) {
// x and y are already in the same set, there is a cycle
return true;
}
uf.unite(x, y);
}
return false;
}
int main() {
vector> edges = {{0, 1}, {1, 2}, {2, 0}};
bool hasCycle = hasCycle(edges);
if (hasCycle) {
cout << "The graph has a cycle." << endl;
} else {
cout << "The graph does not have a cycle." << endl;
}
return 0;
}
这个示例代码使用了一个UnionFind类来实现并查集数据结构。在构造函数中,创建了一个包含n个元素的并查集,并初始化每个元素的parent为其自身。find函数用于查找元素所属的集合,通过递归路径压缩优化来减少查找时间。unite函数用于合并两个元素所属的集合,通过rank优化来保证合并后树的平衡性。hasCycle函数用于判断给定的有向图是否存在环。
在main函数中,创建了一个包含三条边的有向图,并调用hasCycle函数来判断是否存在环。根据结果输出相应的信息。
下一篇:不使用malloc的链表