并查集C++代码:
#include<iostream>
#include<fstream>
#include<time.h>
using namespace std;
template<class E>
class UFSet
{
private:
int *parent;
E* elements;
int size;
public:
void input(E *e)
{
for(int i=0;i<size;i++)
{
elements[i]=e[i];
}
}
UFSet(int s):size(s)
{
parent=new int[s];
for(int i=0;i<s;i++)
{
parent[i]=-1;
}
elements=new E[s];
};
int find(int x) //查找x的父节点
{
int r=x;
while(parent[r]>0) //压缩路径
r=parent[r];
while(x!=r)
{
int temp=parent[x];
parent[x]=r;
x=temp;
}
return r;
};
void Union(int a,int b)
{
int r1=find(a);
int r2=find(b);
if(r1==r2) return;//已经在同一个集合中
if(parent[r1]<parent[r2])
{
parent[r1]+=parent[r2];
parent[r2]=r1;
}
else
{
parent[r2]+=parent[r1];
parent[r1]=r2;
}
};
E getData(int x)
{
if(x>0&&x<size)return elements[x];
};
void output()
{
for(int i=0;i<size;i++)
{
if(parent[i]>0)
cout<<elements[i]<<"的根是"<<elements[find(i)]<<endl;
}
}
};
int main()
{
int data[12];
UFSet<int> ufs(12);
for(int i=0;i<12;i++)
{
data[i]=i;
}
ufs.input(data);
ufs.Union(0,4);
ufs.Union(3,1);
ufs.Union(6,10);
ufs.Union(8,9);
ufs.output();
cout<<endl;
ufs.Union(7,4);
ufs.Union(6,8);
ufs.Union(3,5);
ufs.output();
cout<<endl;
ufs.Union(2,11);
ufs.Union(2,11);
ufs.Union(11,0);
ufs.output();
return 0;
}