今天在做杭电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 }