代码随想录 并查集

并查集是用来判断两个元素是否在同一集合内,或者将两个元素放入同一个集合中。并查集使用的方法是通过将所有元素转化成一个高度为一的多叉树,如果这两个元素的根相同,那么他们就是一个以下是代码模板

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

冗余连接II

解题思路

本题是有向图,和无向图相比,需要考虑的更多。当一个节点的入度为2时,需要判断哪条边可以删除,优先删除顺序靠后的点。如果整个有向图没有入度为2的节点时,说明有环了,我们只需要删掉环内的其中1边即可。而查找的方式则使用并查集,把所有连接的两个节点放入并查集,遇到要删除的边就跳过

知识点

并查集,有向图

心得

注意遍历节点的时候要从后往前遍历

posted @ 2024-08-21 03:48  不进育碧不改名  阅读(7)  评论(0编辑  收藏  举报