代码随想录 并查集
并查集是用来判断两个元素是否在同一集合内,或者将两个元素放入同一个集合中。并查集使用的方法是通过将所有元素转化成一个高度为一的多叉树,如果这两个元素的根相同,那么他们就是一个以下是代码模板
int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好
vector<int> father = vector<int> (n, 0); // C++里的一种数组结构
// 并查集初始化
void init() {
for (int i = 0; i < n; ++i) {
father[i] = i;
}
}
// 并查集里寻根的过程
int find(int u) {
return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
}
// 判断 u 和 v是否找到同一个根
bool isSame(int u, int v) {
u = find(u);
v = find(v);
return u == v;
}
// 将v->u 这条边加入并查集
void join(int u, int v) {
u = find(u); // 寻找u的根
v = find(v); // 寻找v的根
if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回
father[v] = u;
}
寻找存在的路径
解题思路
判断从A到B的路径是否存在,我们是需要判断A和B是否属于同一个集合,在图论中,“同一个节点就是指A和B的路途上有边连在一起。
知识点
并查集
心得
学习了并查集的基础知识并加以利用
冗余连接
解题思路
能够将无向图转化为树,那么说明避免两个元素在同一个集合内,我们只需要利用并查集找到第一个输入的节点在同一集合内的就行。
知识点
并查集
心得
理解了并查集之后就很容易做出来
冗余连接II
解题思路
本题是有向图,和无向图相比,需要考虑的更多。当一个节点的入度为2时,需要判断哪条边可以删除,优先删除顺序靠后的点。如果整个有向图没有入度为2的节点时,说明有环了,我们只需要删掉环内的其中1边即可。而查找的方式则使用并查集,把所有连接的两个节点放入并查集,遇到要删除的边就跳过
知识点
并查集,有向图
心得
注意遍历节点的时候要从后往前遍历