并查集(如 畅通工程或经商人脉问题)
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、利用一个数组来统计每个点的根的情况从而知道总共有几个大集合,
(因为上面那个路径压缩只是尽可能地压缩路径,并不能保证每个集合都是直接连在根上的,所以需要这一步)