好东西并查集

今天在做杭电BestCoder30期题目的时候遇到了问题,于是看了解决方案说是要用到并查集,于是就知道了这个神奇的东西。

简单介绍一下并查集:

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

集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的数组所在的集合合并。
 
简单的并查集由两个函数和一个数组组成:
1.数组Pre[]:  
  数组Pre[x]用于存储集合中的点x的前导节点,用来判断两个点是否在同一个集合中。
2.两个函数:
  函数find(int x)用于查找一个集合中的代表点,代表点即集合的根节点,是一个集合的标志。函数union(int x,int y)用来合并两个具有相同有关系的集合。
 
下面是两个函数的代码:(数据存储采用数组存储)  1 int pre[ 1000 ]; 
 2 
 3  int find(int x)                                                                                                     
 4  { 
 5     int r=x;
 6     while ( pre[r ] != r )                                          
 7     r=pre[r ];
 8 
 9    int i=x,j ;
10 
11    while( i != r )    //路径压缩,为了节省后续节点的查找时间
12    {
13     j = pre[ i ]; 
15        pre[ i ]= r ; 
17        i=j;
18    }
19 
20    return r ;
21  
22  }
23 
24 void union(int x,int y)  //合并两个集合,同时也是在初始时构造并查集的函数
25 {
27    int fx=find(x),fy=find(y);
29 if(fx!=fy) 30 pre[fx ]=fy; 31 32 }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值