并查集操作
#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; }