图论|并查集理论基础 1971. 寻找图中是否存在路径

什么是并查集

并查集是一种数据结构,用于处理一些不交集的合并及查询问题。它支持两种操作:

查找(Find):确定某个元素属于哪个子集。它可以用来判断两个元素是否属于同一个子集。

合并(Union):将两个子集合并成一个集合。

并查集的功能

将连通边加入并查集

在join函数中 我们需要先寻找 u 和 v 的根,然后再进行连线在一起,而不是直接 用 u 和 v 连线在一起。

java 复制代码
// 将v,u 这条边加入并查集
void join(int u, int v) {
    u = find(u); // 寻找u的根
    v = find(v); // 寻找v的根
    if (u == v) return; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回
    father[v] = u;
}

并查集里寻根的过程

java 复制代码
int find(int u) {
    if (u == father[u]) return u; // 如果根就是自己,直接返回
    else return find(father[u]); // 如果根不是自己,就根据数组下标一层一层向下找
}

并查集初始化

java 复制代码
void init() {
    for (int i = 0; i < n; ++i) {
        father[i] = i;
    }
}

如何判断两个元素是否在同一个集合里

java 复制代码
bool isSame(int u, int v) {
    u = find(u);
    v = find(v);
    return u == v;
}

路径压缩:所有节点直接指向根节点

只需要在递归的过程中,让 fatheru 接住 递归函数 find(fatheru) 的返回结果。

因为 find 函数向上寻找根节点,fatheru 表述 u 的父节点,那么让 fatheru 直接获取 find函数 返回的根节点,这样就让节点 u 的父节点 变成根节点。

java 复制代码
int find(int u) {
    if (u == father[u]) return u;
    else return father[u] = find(father[u]); // 路径压缩
}

1971. 寻找图中是否存在路径

**题目:**有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edgesi = ui, vi 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。

请你确定是否存在从顶点 source 开始,到顶点 destination 结束的 有效路径 。

给你数组 edges 和整数 n、source 和 destination,如果从 source 到 destination 存在 有效路径 ,则返回 true,否则返回 false 。
题目链接: 1971. 寻找图中是否存在路径
代码如下

java 复制代码
class Solution {
    public int[] father;
    public int find(int u) {
        if (u == father[u]) return u; // 如果根就是自己,直接返回
        else return find(father[u]); // 如果根不是自己,就根据数组下标一层一层向下找
    }
    public void join(int u, int v) {
        u = find(u); // 寻找u的根
        v = find(v); // 寻找v的根
        if (u == v) return; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回
        father[v] = u;
    }
    public boolean isSame(int u, int v) {
        u = find(u);
        v = find(v);
        return u == v;
    }
    public boolean validPath(int n, int[][] edges, int source, int destination) {
        father=new int[n];
        for (int i = 0; i < n; i++) {
            father[i] = i;
        }
        
        for(int i=0;i<edges.length;i++){
                join(edges[i][0],edges[i][1]);
            }
        return isSame(source,destination);

    }
    
}
相关推荐
不知名的老吴11 分钟前
线程的生命周期之线程“插队“
java·开发语言·python
ANnianStriver21 分钟前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
杨了个杨89821 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
马士兵教育3 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
snow@li4 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
云烟成雨TD4 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework4 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
逍遥德4 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD4 小时前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_523185324 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端