classDisjSet{private:
int* disjSet;public:DisjSet(const int max_size){
disjSet =newint[max_size];for(int i =0; i < max_size;++i)*(disjSet + i)= i;}
int getParts(){return parts;}
int find(int x){return x ==*(disjSet + x)? x :(*(disjSet + x)=find(*(disjSet + x)));}voidto_union(int x1, int x2){*(disjSet +find(x1))=find(x2);}
bool is_same(int e1, int e2){returnfind(e1)==find(e2);}~DisjSet(){delete[] disjSet;
disjSet =NULL;}};
二代(含有树的统计)
源代码
classDisjSet{private:
int* disjSet;
int parts;//该类里面有多少棵树public:DisjSet(const int max_size){
disjSet =newint[max_size];for(int i =0; i < max_size;++i)*(disjSet + i)= i;
parts = max_size;}
int getParts(){return parts;}
int find(int x){return x ==*(disjSet + x)? x :(*(disjSet + x)=find(*(disjSet + x)));}voidto_union(int x1, int x2){if(find(x1)!=find(x2)){*(disjSet +find(x1))=find(x2);--parts;}}
bool is_same(int e1, int e2){returnfind(e1)==find(e2);}~DisjSet(){delete[] disjSet;
disjSet =NULL;}};