您的位置:首页 > 其它

并查集

2016-07-20 17:24 197 查看
初始时n个元素分属不同的n个集合,通过不断的给出元素间的联系,要求实时的统计元素间的关系(直接或间接的联系),可用并查集加以判断。

(1)元素间是否有联系:判断两个元素是否属于同一个集合;(查)
(2)建立元素间的联系:只需合并两个元素各自所属的集合。(并)

并查集本身不具有结构,必须借助一定的数据结构 实现。一般用的比较多的是数组、链表和树来实现。


实现方法1:

用编号最小的元素标记所在集合;定义一个数组 set[1..n] ,其中set[i] 表示元素i 所在的集合;




find1(x)
{
return set[x];
}
Merge1(a,b)
{
i = min(a,b);
j = max(a,b);
for (k=1; k<=N; k++)
{
if (set[k] == j)
set[k] = i;
}
}


实现方法2:

每个集合用一棵“有根树”表示定义数组 father[1..n],father[i] = i , 则i表示本集合,且是集合对应树的根father[i] = j, j<>i, 则 j 是 i 的父节点.
用某个元素所在树的根结点表示该元素所在的集合,判断两个元素时候属于同一个集合的时候,只需要判断他们所在树的根结点是否一样即可
这样,当我们合并两个集合的时候,也只需在两个根结点之间连边即可

避免最坏情况:
方法:将深度小的树合并到深度大的树实现


int findx(int x)
{
int r=x;
while(p[r] !=r)
r=p[r];
return r;
}
void merge(int x, int y)
{
int fx,fy;
fx = findx(x);
fy = findx(y);
if(fx != fy)
p[fx] = fy;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: