您的位置:首页 > 其它

并查集(不相交集合)

2012-04-06 21:44 316 查看
不相交集合有两种不同的实现,链表表示和带路径压缩的按秩合并策略。看到大家都比较喜欢用带路径压缩的按秩合并策略,那么我只认真研究了一下带路径压缩的按秩合并策略,暂时不对链表表示作讨论。

  顾名思义,并查集的作用不就的“并”和“查”嘛。并查集的功能描述为:合并两个集合;将一元素并入另一集体;判断两个元素是否属于同一个集合。

  通过引用两种启发式策略(按秩合并和路径压缩)就可以达到渐进意义上最快的不相交集合数据结构。

1、make_set(x) 把每一个元素初始化为一个集合

建立一个新的集合,其中集合只有唯一的一个元素x

2、union_set(x, y) 按秩合并x,y所在的集合

3、find_set(x)返回x所在的集合的代表

  


  在执行查找操作时,要沿着父节点指针一直找下去,直到找到树根为止。大家要注意途中的箭头。

4、实现并查集的标准代码:

1 #include <stdio.h>

2

3 const int MAXN = 100; /*结点数目上线*/

4 int pa[MAXN]; /*p[x]表示x的父节点*/

5 int rank[MAXN]; /*rank[x]是x的高度的一个上界*/

6

7 void make_set(int x)

8 {/*创建一个单元集*/

9 pa[x] = x;

10 rank[x] = 0;

11 }

12

13 int find_set(int x)

14 {/*带路径压缩的查找*/

15 if(x != pa[x])

16 pa[x] = find_set(p[x]);

17 return pa[x];

18 }

19

20 /*按秩合并x,y所在的集合*/

21 void union_set(int x, int y)

22 {

23 x = find_set(x);

24 y = find_set(y);

25 if(rank[x] > rank[y])/*让rank比较高的作为父结点*/

26 pa[y] = x;

27 else

28 {

29 pa[x] = y;

30 if(rank[x] == rank[y])

31 rank[y]++;

32 }

33 }

相关练习:


POJ 1611
The Suspects (并查集)


POJ 2524 Ubiquitous Religions (并查集)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: