对于并查集生动且易理解的解释在这里 →传送门:https://blog.csdn.net/niushuai666/article/details/6662911
可以说这篇博客读完后,基本的理解就没问题了。 在这里还是膜拜大神!!
下面主要是对于并查集的实现作一个总结吧
1. 求某结点的树根编号,路径压缩(将每个结点的父结点直接对应为根结点)
2.合并两个集合
int pre[N]; //所有根节点集合
1.unionsearch是寻找根节点以及路径压缩
int unionsearch(int root) //查找根结点
{
int son, tmp;
son = root;
while(root != pre[root]) //寻找根结点
root = pre[root];
while(son != root) //路径压缩
{
tmp = pre[son];
pre[son] = root;
son = tmp;
}
return root;
}
// 转的大佬的代码,用来自己做解析hhhhh
这里是个路径压缩代码的理解:
2. join 集合合并
void join(int root1, int root2) //判断是否连通,不连通就合并
{
int x, y;
x = unionsearch(root1); //x为root1的根节点
y = unionsearch(root2); //y为root2的根节点
if(x != y) //如果不连通,就把它们所在的连通分支合并
pre[x] = y; //将x的根结点作为y的子结点
}
另:两行解决你的烦恼,不过具体实现时可能会有相应添加
int find(int x)//找x的根结点 + 路径压缩
{
if(pre[x] != x) pre[x] = find(pre[x]);
return pre[x];
}