并查集(如 畅通工程或经商人脉问题)

BNU Training 2018 训练2 http://www.bnuoj.com/v3/contest_show.php?cid=9321#problem/D

哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)https://www.nowcoder.com/acm/contest/27/D

并查集的实现主要依赖函数的构造:

一般来说只需要一个 int find(int  x) ;即可,可以说只要把 int find (int x) ;函数写好,并查集的基本操作基本就都能实现了

这个函数如果简单的话,就直接 while(x != pre[x]) x  = pre[x]; return x; 即可,而为了达到压缩路径提高查找速度的效果,一般再写一段代码把每个集合都直接连在根上,下面为具体的代码实现:(分为三步:

1、find函数的实现(尽可能地压缩路径,(但并不能保证每个集合都是直接连在根上的)))

2、合并效果的实现(可以写个join或直接写在main()里面)

3、通过一个数组 + find(i) 遍历每个 节点的根(因为压缩只是尽可能压缩,并不能保证每个节点直接连在根上,所以还是需要利用find找根)

1、find函数的实现

 

2、合并集合的操作(可以写成一个join 函数,也可以直接写在主函数内,如下)

 

3、利用一个数组来统计每个点的根的情况从而知道总共有几个大集合,

(因为上面那个路径压缩只是尽可能地压缩路径,并不能保证每个集合都是直接连在根上的,所以需要这一步)

 

posted @ 2018-01-20 20:39  MekakuCityActor  阅读(122)  评论(0编辑  收藏  举报