并查集,也叫不相交集的数据结构。
具体的可以百度,有很多,这里不再说具体的定义,给出一种实现,包含了路径压缩。
#include <iostream>
using namespace std;
const int MAX_SIZE=100;
int parent[MAX_SIZE];
int rank[MAX_SIZE];
int Find(int x)
{
int y,root,w;
y=x;
while(parent[y]!=y)
{
y=parent[y];
}
root=y;
y=x;
while(parent[y]!=y) //执行路径压缩
{
w=parent[y];
parent[y]=root;
y=w;
}
return root;
}
void Union(int root1,int root2)
{
int u,v;
u=Find(root1);
v=Find(root2);
if(rank[u]<=rank[v])
{
parent[u]=v;
if(rank[u]==rank[v])
++rank[v];
}
else
parent[v]=u;
}
void Init()
{
memset(rank,0,sizeof(rank));
for(int i=1;i<MAX_SIZE;i++)
parent[i]=i;
}
int main()
{
Init();
Union(1,2);
Union(3,4);
cout<<Find(4)<<endl;
cout<<rank[4]<<endl;
Union(4,6);
Union(7,8);
cout<<Find(7)<<endl;
cout<<Find(8)<<endl;
cout<<rank[8]<<endl;
Union(6,7);
cout<<rank[8]<<endl;
cout<<Find(2)<<endl;
cout<<Find(3)<<endl;
cout<<Find(6)<<endl;
cout<<Find(8)<<endl;
cout<<Find(7)<<endl;
return 0;
}
这几天再慢慢来应用,在用Kruskal最小生成树时,就有用到这个了。