关于并查集,网上已经有许多相应介绍,推荐一篇不错的文章并查集详解 (转) ;
一个PAT题目应用到并查集的例子:1118. Birds in Forest (25)
题解:1118. Birds in Forest (25)
注:并查集用数组实现比较方便,故以下演示代码用set[ ]数组进行储存
并查集的三个操作函数,现记录如下:
void Init();//初始化并查集
int Find(int x);//找到x的根节点
void Union(int x,int y);//将x,y并入同一集(一开始x,y在不同的集合)
函数实现:
void Init()
{
for(int i=1;i<=size;++i)//size为并查集的大小
Set[i]=i;
}
int Find(int x)
{
int r=x;//r为并查集的root
while(Set[r]!=r)//当前r不是root时执行
r=Set[r];
int i=x,j;
while(i!=r)//路径压缩
{
j=Set[i];
Set[i]=r;
i=j;
}
return r;
}
void Union(int x,int y)
{
int X=Find(x),Y=Find(y);
if(X!=Y)//根不同,说明不在同一集合
Set[X]=Y;
}
1849

被折叠的 条评论
为什么被折叠?



