#include <bits/stdc++.h>
using namespace std;
#define MAX 100
class UnionSet{
private:
int data[MAX+1];//即上级数组
public:
UnionSet(int len){
for(int i=1;i<=len;i++) data[i]=i;
}
//将 a b 合并为一个集合里的元素,当然对应的下级也都合并了
UnionSet merge(int a,int b){
int aa=this->find(a);
int bb=this->find(b);
//如果不是同一个集合
//当然忽略具体的上级关系,反正加入了集合
if(aa!=bb)
data[aa]=data[bb];
return *this;
}
//找x对应的顶级上级名字,并且顺道把把经过的路径修改成顶级上级的名字,加速下次查找
//这是路径压缩算法,目前最优的算法,时间复杂度无限接近于O1
//递归,借助于系统的栈,需要的空间小
int find(int x){
return x==data[x]?x:data[x]=find(data[x]);
}
//非递归,这种做法不好
// int find(int x){
// int k=x,*a=new int[MAX],index=0;//可以看出这种算法需要很大的空间
// while(k!=data[k]){
// a[index++]=k;
// k=data[k];
// }
// for(int i=0;i<index;i++)
// data[a[i]]=k;
// delete[] a;
// return k;
// }
bool connected(int x,int y){
return find(x)==find(y);
}
void show(int len){
for(int i=1;i<=len;i++) cout<<data[i]<<" ";
cout<<endl;
}
};
int main(){
UnionSet us(100);
us.show(10);
us.merge(1,2).merge(3,4);
us.merge(3,4);
us.show(10);
us.merge(1,3);
us.show(10);
cout<<us.connected(1,4)<<endl;
us.show(10);
return 0;
}