好东西并查集

今天在做杭电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 }
我是一块砖,哪里需要往哪搬。
原文地址:https://www.cnblogs.com/daimadebanyungong/p/4324482.html