ACM 简单并查集

                                                                                                                                 ------------Snowbee3012

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 

基本操作

Father[x];    //表示x的父亲

初始化:

        Father[i]=i;  // i = 0 ----n

合并两个不相交集合

操作很简单:先设置一个数组Father[x],表示x的“父亲”的编号。 那么,合并两个不相交集合的方法就是,找到其中一个集合最父亲的父亲(也就是最久远的祖先),将另外一个集合的最久远的祖先的父亲指向它

 

void  Union(int x ,int y)

{

          x=GetFather(x);    //获得最久远的祖先

          y=GetFather(y);

          if(x!=y)Father[x]=y; //把 y 设置为x的父亲

}

获得祖先:路径压缩

 

     int GetFather(int x)

     {

          if(x == Father[x])return x;

          else  Father[x]=GetFather(x); //路径压缩,对每个路径上的节点都

          return Father[x];            //赋予其祖先节点

}

具体实例:

假设有一群编号的人,给出其中一些人认识的关系 (x,y)表示x认识y

(x,y) (y,z) ---> (x,y,z)

给出几组关系

(1,2) (3,5) (5,2) (4,1)

初始化:

Father[1]=1   Father[2]=2   Father[3]=3   Father[4]=4   Father[5]=5

(1,2)

Father[1]=2    Father[2]=2   Father[3]=3    Father[4]=4   Father[5]=5

(3,5)

Father[1]=2     Father[2]=2   Father[3]=5   Father[4]=4   Father[5]=5

(5,2)

Father[1]=2    Father[2]=2    Father[3]=5   Father[4]=4   Father[5]=2

(4,1)

Father[1]=2    Father[2]=2    Father[3]=5   Father[4]=2   Father[5]=2

最终查找:

if(i==GetFather(i))result++;1 : Father[1]=2

2:  Father[2]=2

3:  Father[3]=2

4:  Father[4]=2

5:  Father[5]=2

即在最后查找的一步,对所有元素都赋给其祖先

acm.hdu.edu.cn 并查集题目:

1213  2473   1879  1233  1875  1863  1856  1272 

以上内容参照维基百科

转载于:https://www.cnblogs.com/snowbee/archive/2010/10/29/1864857.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值