union采用按高度求并,find采用路径压缩。存储的高度值为实际高度的负值减一。
#include <vector>
using namespace std;
class DisjSets
{
public:
explicit DisjSets(int numElements);
int find(int x)const;
int find(int x);
void unionSets(int root1,int root2);
private:
vector<int> s;
};
DisjSets::DisjSets(int numElements):s(numElements,-1)
{
}
void DisjSets::unionSets(int root1, int root2)
{
if(s[root1]<s[root2])//将root2并到root1上
{
s[root2]=root1;
}
else if (s[root1]==s[root2])
{
s[root2]=root1;
--s[root1];
}
else
{
s[root1]=root2;
}
}
int DisjSets::find(int x)
{
if(s[x]<0)
return x;
else
{
return s[x]=find(s[x]);
}
}