并查集的数组实现。
#include<iostream>
#include<vector>
using namespace std;
class DisjSets
{
public:
explicit DisjSets(int numElements);
int find(int x);//修改函数-路径压缩
bool unionSets(int root1, int root2);
void printParent();
private:
vector<int> parent;
vector<int> rank;//秩
};
DisjSets::DisjSets(int numElements) :parent(numElements),
rank(numElements, 0)
{
for (int i = 0; i < numElements; i++)
{
parent[i] = i;
}
}
bool DisjSets::unionSets(int x1, int x2)//按高度合并根节点,合并成功返回true,否则返回false
{
int root1 = find(x1);
int root2 = find(x2);
if (root1 == root2) return false;//属于同一集合
if (rank[root1] < rank[root2])
parent[root1] = root2;
else//合并到root1上
{
if (rank[root1] == rank[root2])
++rank[root1];
parent[root2] = root1;
}
return true;
}
int DisjSets::find(int x)
{
if (parent[x] == x) return x;
else return parent[x] = find(parent[x]);
}
void DisjSets::printParent()
{
for (auto iter = parent.begin(); iter != parent.end(); ++iter)
{
cout << *iter << " ";
}
cout << endl;
}