Day48 | 107.寻找存在的路径

2024-08-27 13:12
文章标签 路径 存在 107 寻找 day48

本文主要是介绍Day48 | 107.寻找存在的路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

语言

Java

107.寻找存在的路径

题目

107. 寻找存在的路径

题目描述

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

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

输入描述

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

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

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

输出描述

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

思路

  1. 初始化并查集
    • 创建一个大小为n+1的数组father,其中n是节点的数量。每个位置i的值初始化为i,表示每个节点最初都是自己的根节点。
  2. 处理边的连接
    • 读入每条边的两个端点st,然后调用join(s, t)方法来合并这两个节点所在的集合。
  3. 判断连通性
    • 对于给定的源节点source和目标节点destination,分别找到它们各自的根节点,如果这两个根节点相同,则表示这两个节点是连通的。

代码

import java.util.Scanner;
import java.util.Arrays;public class Main {private static int n; // Number of nodesprivate static int[] father; // Parent array initialized to store parent for each nodepublic static void main(String[] args) {Scanner scanner = new Scanner(System.in);n = scanner.nextInt(); // Read the number of nodesint m = scanner.nextInt(); // Read the number of edgesinit(n); // Initialize the union-find data structurewhile (m-- > 0) {int s = scanner.nextInt();int t = scanner.nextInt();join(s, t); // Join the two nodes}int source = scanner.nextInt();int destination = scanner.nextInt();System.out.println(isSame(source, destination) ? 1 : 0); // Check if source and destination are in the same setscanner.close();}// Initializes the parent array with the nodes themselvesprivate static void init(int n) {father = new int[n + 1];Arrays.fill(father, -1); // Initialize all parents to -1for (int i = 1; i <= n; i++) {father[i] = i; // Each node is its own parent initially}}// Finds the root of the set that contains node 'u'private static int find(int u) {return u == father[u] ? u : (father[u] = find(father[u])); // Path compression}// Checks if nodes 'u' and 'v' belong to the same setprivate static boolean isSame(int u, int v) {return find(u) == find(v);}// Merges the sets containing nodes 'u' and 'v'private static void join(int u, int v) {u = find(u); // Find the root of the set containing uv = find(v); // Find the root of the set containing vif (u == v) return; // If they are already in the same set, do nothingfather[v] = u; // Make the root of v point to the root of u}
}

易错点

  1. 初始化时的赋值

    • 在初始化时,每个节点的父节点应被设为它自己。在Java中,可以先使用Arrays.fill(father, -1)将数组填充为-1,然后再遍历数组将每个位置设为它自己。这样做是为了避免负数作为节点编号的情况。
  2. 路径压缩

    • find方法中,使用了路径压缩技术,即在递归查找根节点的过程中更新每个节点的父节点,使其直接指向根节点。这样可以提高查找效率。
  3. 循环条件

    • 在处理边的循环中,使用while (m-- > 0),这里m--意味着每次循环后m的值减1。这是一个常见的写法,但需要注意不要在循环外部再对m进行操作,否则可能会导致逻辑错误。
  4. 边界情况

    • join方法中,如果两个节点已经是同一个集合中的成员,则不需要做任何操作。这可以通过检查两个节点的根节点是否相同来实现。

总结

今天学了并查集理论

应用完成了一道题

明天继续图论继续加油!

天道酬勤

这篇关于Day48 | 107.寻找存在的路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111769

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE