代码随想录算法训练营第55天 | 寻找存在的路径

news2024/11/17 10:41:07

寻找存在的路径 

题目描述

给定一个包含 n 个节点的无向图中,节点编号从 1 到 n (含 1 和 n )。

你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。

输入描述

第一行包含两个正整数 N 和 M,N 代表节点的个数,M 代表边的个数。 

后续 M 行,每行两个正整数 s 和 t,代表从节点 s 与节点 t 之间有一条边。 

最后一行包含两个正整数,代表起始节点 source 和目标节点 destination。

输出描述

输出一个整数,代表是否存在从节点 source 到节点 destination 的路径。如果存在,输出 1;否则,输出 0。

输入示例

5 4
1 2
1 3
2 4
3 4
1 4

输出示例

1

提示信息

数据范围:

1 <= M, N <= 100。

思路:这道题涉及到了并查集的概念。

那么什么是并查集呢,简单来说并查集的功能就是能够判断两个节点是否在同一个集合里面,并且还能够将两个节点加入同一个集合里面。

实现的方式呢就是使用一个parent数组来保存节点之间的联系,就好像一棵二叉树一样,结点之间是有联系的。

所以一般模板涉及到四个函数,init函数负责初始化每个结点的根节点为自身;find函数负责找到每个结点的根,这里涉及到了路径压缩,也就是可能某个结点距离它的根很远,但是在最后递归找到后,直接将根的值返回,保存在了该结点的parent里面,这样就将路径压缩短了;isSame函数则是判断两个结点的根是否相等;join函数则是将两个结点加入同一个并查集中。

正是因为有了路径压缩,所以一般来说,并查集的时间复杂度是O(logn)到O(1)之间的,刚开始可能是O(logn),但是随着规模越来越大,路径不断被压缩,最终查找的效率就会趋近于O(1)。

所以说回到这道题本身,判断是否有从source到destination的可达路径,那么就将所有边join后,判断source与destination是否具有相同的根即可。如果是,说明是存在这样的一条可达路径;如果不是,则不存在这样一条可达的路径

#include<iostream>
#include<vector>
using namespace std;

int n, m;
vector<int> parent(101);
void init(){
    for(int i = 1; i <= n; i ++){
        parent[i] = i;//初始化
    }
}
//找寻根节点
int find(int u){
    return u == parent[u] ? u : parent[u] = find(parent[u]);//压缩路径
}
//判断两个节点的根节点是否相等
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);
    v = find(v);
    if(u == v) return;
    parent[v] = u;
}

int main(){
    while(cin >> n >> m){
        init();
        int node1, node2, source, destination;
        for(int i = 0; i < m; i ++){
            cin >> node1 >> node2;
            join(node1, node2);
        }
        cin >> source >> destination;
        if(isSame(source, destination)) cout << 1 << endl;
        else cout << 0 << endl;
    }
}

感谢你的阅读,希望我的文章能够给你帮助,如果有帮助,麻烦点赞加收藏,或者点点关注,非常感谢。

如果有什么问题欢迎评论区讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openpnp - 为了防止物料操作混乱,做一张物料分布位置图清晰一些

文章目录 openpnp - 为了防止物料操作混乱&#xff0c;做一张物料分布位置图清晰一些概述笔记做子装配图做总装配图备注END openpnp - 为了防止物料操作混乱&#xff0c;做一张物料分布位置图清晰一些 概述 看网上资料&#xff0c;当openpnp贴片机上料后&#xff0c;为了防止…

海山数据库(He3DB)+AI(四):一种基于迁移学习的启发式数据库旋钮调优方法

文章目录 0 前言1 OpAdviser1.1 主要工作1.2 总体流程 2 确定搜索空间2.1 相似任务识别2.2 有效区域提取2.3 多数加权投票 3确定优化器3.1 元特征提取3.2 离线数据生成3.3 Meta-Ranker构建 4 参考文献 0 前言 在海山数据库(He3DB)AI&#xff08;三&#xff09;中&#xff0c;介…

华润置地基于Apache SeaTunnel构建统一数据集成框架

作者&#xff1a;田力、陈允德 编辑整理&#xff1a;曾辉 引言 随着数字化转型的深入&#xff0c;企业对数据集成与处理的需求不断提升&#xff0c;如何高效、灵活地处理多系统、多数据源的同步&#xff0c;成为企业数据系统建设中的关键挑战。 在这篇文章中&#xff0c;来自…

display:flex;和margin的妙用

想要实现这样的效果&#xff1a; 第一个想法就是使用display:flex;justify-content: space-between; 所以想要得到效果&#xff0c;一般来说还需要在盒子外面再套一层盒子才行&#xff0c;但是也可以使用margin来实现。 <!DOCTYPE html> <html lang"en"&g…

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪&#xff0c;都什么年代了&#xff0c;还学makefile&#xff0c;cmake都有些过时了&#xff0c;为什么还要再学这个呢&#xff1f; 我是这么看待这个问题的&#xff0c;cmake跨平台性还是很有有优势的&#xff0c;有着多年积累的底蕴&#xff0c;借助大模…

c++反汇编逆向还原——do while循环(笔记)

c反汇编逆向还原代码do while循环的实现 涉及到的汇编指令mov、lea、cmp、jle、push 一、汇编 汇编代码 涉及到的指令 mov &#xff1a;将源操作数复制到目的操作数 lea &#xff1a;与mov类似 mov a&#xff0c;b 表示将b赋值给a 若是 mov a&#xff0c;[b] 这是将b的…

OpenAI首席技术官Mira Murati宣布她将离开公司

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

解决VsCode不显示环境名称

在VSCODE终端中激活运行的conda环境&#xff0c;但是只显示PS&#xff0c;并不显示环境名称 PS D:\Code\Pro\003_pro> 解决方法&#xff1a;以管理员权限打开PowerShell 方式1&#xff1a;在Cortana搜索栏中打开带管理员权限的PowerShell 在Windows 10的任务栏搜索框输入p…

Ansible-template模块动态生成特定文件

文章目录 一、Jinja2介绍什么是主要特性安装基本用法进阶特性总结 Jinja2与Ansible关系1. 模板引擎2. Ansible 的依赖3. 变量和模板4. 动态生成配置5. 社区和生态系统总结 二、Ansible如何使用Jinja2使用template模块Jinja2文件中使用判断和循环Jinja2文件中使用判断语法 Jinja…

一文读懂Service以及实践攻略

一文读懂Service以及实践攻略 目录 1 一文读懂 Kubernetes Service 以及实践攻略 1.1 1. 什么是 Service&#xff1f; 1.1.1 为什么需要 Service&#xff1f; 1.2 2. Service 的工作原理 1.2.1 核心概念1.2.2 流量转发过程 1.3 3. Service 的几种类型及应用场景 2 实践&#…

基于SpringBoot校园失物招领系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义&#xff0c;在国内外的研究现状和发展趋势&#xff0c;尚待研究的问题 作用&#xff1a;本课题的目的是使失物招领信息管理清晰化&#xff0c;透明化&#xff0c;便于操作&#xff0c;易于管理。通过功能模…

【JavaSE】-- 类和对象(2)

文章目录 6. 封装6.1 封装的概念6.2 访问限定符6.3 封装拓展之包6.3.1 包的概念6.3.2 导入包中的类6.3.3 自定义包 7. static成员7.1 再谈学生类7.2 static修饰成员变量7.3 static修饰成员方法7.4 static成员变量初始化 8. 代码块8.1 代码块概念以及分类8.2 普通代码块8.3 构造…

神经网络(四):UNet图像分割网络

文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 一、简介 UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络结构&#xff0c;因此称为UNet。该网络具有编码器和解码器结构&#xff0c;两种结构的功能如下&#…

程序执行过程中,报错debug errror damage :after normal block at

1.现象描述 Visual C 6.0运行一段程序&#xff0c;报错&#xff1a;debug errror damage :after normal block at&#xff08;堆损坏了&#xff09;。网上查了一下&#xff0c;说是内存访问越界。Debug模式下&#xff0c;点击忽略还能继续执行。 下面&#xff0c;我将通过断…

门牌风水大揭秘:如何通过八卦福·门牌提升居住运势

在现代家居风水理念中&#xff0c;门牌不仅是房屋的标识&#xff0c;更是影响居住运势的重要因素。八卦福门牌由于其独特的设计与深厚的文化内涵&#xff0c;已成为风水爱好者的新宠。通过合理运用八卦福门牌&#xff0c;我们可以有效提升家中的气场&#xff0c;增强运势。本文…

深入浅出 ResNet(残差网络)

一、引言 随着深度学习的发展&#xff0c;卷积神经网络&#xff08;Convolutional Neural Networks, CNNs&#xff09;在图像识别、目标检测等多个计算机视觉任务中取得了卓越的成绩。然而&#xff0c;随着网络深度的增加&#xff0c;训练变得更加困难&#xff0c;出现了梯度消…

2024网安周 | 百度安全深度参与,探索人工智能与数字安全的融合发展之路

9月9日-15日&#xff0c;2024年国家网络安全宣传周在全国范围内统一举行&#xff0c;本届网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题&#xff0c;由中央宣传部、中央网信办、教育部、工业和信息化部、公安部、中国人民银行、国家广播电视总局、全国总工会…

Javascript编译原理

JavaScript的编译原理是一个复杂但有序的过程&#xff0c;主要涉及分词&#xff08;词法分析&#xff09;、解析&#xff08;语法分析&#xff09;、代码生成以及执行等阶段。以下是对JavaScript编译原理的详细解析&#xff1a; chrome编译流程 1. 分词&#xff08;词法分析&am…

宠物服务小程序的使用功能介绍

宠物服务小程序的使用功能丰富多样&#xff0c;旨在提升宠物主人的生活便利性和宠物的生活质量。以下是一些常见的宠物服务小程序使用功能&#xff1a; 1. 宠物服务商家展示与预约 商家信息展示&#xff1a;展示宠物服务商家的详细信息&#xff0c;包括店铺名称、地址、联系方…

企业为什么要上项目管理系统?项目管理的六大核心要素

随着企业规模的不断扩大和项目数量的增多&#xff0c;传统的手工管理方式已经无法满足企业在项目管理方面的需求。项目管理系统能够帮助企业实现项目信息的集中管理&#xff0c;将所有相关的项目信息&#xff08;如任务、进度、预算、人员等&#xff09;集中存储在一个平台上&a…