并查集是算法中非常重要的概念也是常用的一个结构
网上看到我觉得最好的是https://blog.youkuaiyun.com/niushuai666/article/details/6662911,也就是我参考的博文
我用自己的语言删减了一下进行记录。
并查集的概念
并查集可以生动的用下图表示。
可以看到是一颗颗的树(图),任意两点可以相互访问的是一类。
一般来说,每个点只知道自己的父节点是什么。最远祖先(树的根节点)的父节点是自身。最远祖先相同的两个节点属于同一个集合。
两个集合合并,只需要两个点分别来自两个集合,彼此可以访问,那两个集合就都联通了。
算法实现
那么算法需要实现的部分:
pre[]数组: 用于储存这个节点的父节点。
int uninonsearch(int root) :查找根节点
void join(int root1, int root2) :将root1和root2所属的两个集合合并
因为树可能会变得特别深,不利于查找,所以需要一个路径压缩算法实现下图:其实就是在寻找根节点过程中途径的所有节点的父亲设置为根节点。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int pre[1010];