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

相关文章

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

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

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i