Day48 | 107.寻找存在的路径

news2024/9/23 9:34:08

语言

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 nodes
    private static int[] father; // Parent array initialized to store parent for each node

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        n = scanner.nextInt(); // Read the number of nodes
        int m = scanner.nextInt(); // Read the number of edges

        init(n); // Initialize the union-find data structure

        while (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 set

        scanner.close();
    }

    // Initializes the parent array with the nodes themselves
    private static void init(int n) {
        father = new int[n + 1];
        Arrays.fill(father, -1); // Initialize all parents to -1
        for (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 set
    private 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 u
        v = find(v); // Find the root of the set containing v

        if (u == v) return; // If they are already in the same set, do nothing
        father[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方法中,如果两个节点已经是同一个集合中的成员,则不需要做任何操作。这可以通过检查两个节点的根节点是否相同来实现。

总结

今天学了并查集理论

应用完成了一道题

明天继续图论继续加油!

天道酬勤

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

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

相关文章

最适合企业的财务管理软件:10款热门推荐

文中介绍的财务管理软件工具有&#xff1a;合思、金财管家、金蝶EAS、鼎捷易成、速达3000、畅捷通T、东软财务软件、Xero、Wave、FreshBooks。 在如今这个信息爆炸的时代&#xff0c;市场上有太多选择&#xff0c;每款财务管理软件都声称自己是最好的&#xff0c;但究竟哪一款才…

基于mallat小波变换的图像分解和重建算法matlab仿真,对比不同分解层数图像重建质量

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

.NET 给NuGet包添加Readme

前言 当我们编写了一个NuGet包后&#xff0c;NuGet包的说明会非常重要 我们以之前IX.RCL.Front 这个项目为例 1.添加Readme.md 在项目根目录 添加 Readme.md 文件属性中 生成操作 修改为&#xff1a;内容 2. 在Readme.md中添加 我们想给使用者 的提示 3.生成一个新版本的…

计算机毕业设计选题推荐-农村产权交易与数据可视化平台-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

修改原神角色数据列表:更好用了

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神角色数据列表</title><link rel&qu…

教你从零开始构建大模型!《Python 机器学习》作者新书来了!

自 ChatGPT发布以来&#xff0c;大型语言模型&#xff08;LLM&#xff09;已经成为推动人工智能发展的关键技术。 近期&#xff0c;机器学习和 AI 研究员、畅销书《Python 机器学习》作者 Sebastian Raschka又写了一本新书 ——《Build a Large Language Model (From Scratch)…

Qt_信号槽机制

文章目录 Qt中的信号槽机制1.在widget.h添加处理函数的声明2.添加处理函数的定义3.建立信号和槽的连接4.运行 Qt中的信号槽机制 本质就是给按钮的点击操作&#xff0c;关联上一个处理函数&#xff0c;当用户点击的时候&#xff0c;就会执行这个处理函数。 函数&#xff1a;stat…

string类(3)

string类&#xff08;3&#xff09; push_back 这是尾插一个字符。 append 这是尾插字符串。可以看出来设计得很复杂。 实践中比较常用的是&#xff1a; string s("hello world"); s.push_back( ); s.push_back(x); s.append("zzzzzzzz");用得更多的是&…

PHP移动端商城程序多端支付全端分享系统小程序源码

&#x1f4f1;&#x1f4b0;「移动端商城多端支付全端分享系统」——打造无缝购物新体验&#xff01;&#x1f6cd;️✨ &#x1f680; 开篇&#xff1a;一键触达&#xff0c;购物无界&#xff01; 在这个快节奏的时代&#xff0c;购物也需要跟上步伐&#xff01;&#x1f3c…

PY信号和槽

知不足而奋进 望远山而前行 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 在使用PyQt进行图形用户界面&#xff08;GU…

【网络】数据链路层-MAC帧

数据链路层-以太网与ARP协议 文章目录 1.数据链路层2.以太网2.1什么是以太网2.2MAC帧格式 3.ARP协议3.1为什么有ARP协议&#xff1f;3.2ARP的定位3.3ARP协议工作流程3.4ARP数据格式 4.RARP协议 1.数据链路层 数据链路层是网络协议栈中最底层的内容&#xff0c;而在之前对其他…

重装系统前如何备份数据?让重装无后顾之忧

在日常使用电脑的过程中&#xff0c;有时我们可能需要重装系统以解决一些难以通过常规手段解决的问题。然而&#xff0c;在重装系统之前&#xff0c;最重要的一步就是备份数据&#xff0c;以防止重要信息的丢失。本文将详细介绍如何在重装系统前进行数据备份&#xff0c;确保您…

Neo4j + LangChain:如何构建基于知识图谱的最强RAG系统?

自从 Neo4j 宣布与 LangChain 的集成以来&#xff0c;我们已经看到许多围绕使用 Neo4j 和大语言模型&#xff08;LLM&#xff09;构建检索增强生成&#xff08;RAG&#xff09;系统的用例。这导致了近年来知识图谱在 RAG 中使用的快速增加。基于知识图谱的 RAG 系统在处理幻觉方…

找搭子的社交软件有哪些?国内靠谱找搭子APP排行榜前10名推荐!

咕哇小程序&#xff1a;这是一个实名制的找搭子交友平台&#xff0c;没错是实名制的&#xff0c;所以骗子会少很多&#xff0c;比较纯粹&#xff0c;是我用得最久且一直在用的找搭子平台。在这个平台上&#xff0c;可以轻松找到兴趣相投的各类搭子&#xff0c;无论是旅行搭子、…

html+css+js网页设计 程序员个人编程学习网站15个页面

htmlcssjs网页设计 程序员个人编程学习网站15个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源…

【原创教程】电气制图01:启航EPLAN电气设计

从这篇文章开始,我们将阐述在实际电气制图的过程中,遇到的问题,以及我们应有的思路,从而能够胜任电气设计工作。 我们在接到电气图纸设计的项目时,前期的有效沟通是很关键的,他直接影响到你图纸设计的准确度。 首先,我们需要了解项目的规模、客户的工艺需求、‌预算和…

Meta祭出三篇最详尽Llama微调指南!千字长文,0基础小白必备

如何使用特定领域数据微调LLM&#xff0c;如何确定微调适配自己的用例&#xff0c;以及如何管理良好训练数据集的经验法则。 接下来&#xff0c;直接进入正题。 针对所有自学遇到困难的同学们&#xff0c;我帮大家系统梳理大模型学习脉络&#xff0c;将这份 LLM大模型资料 分享…

蓝牙信令测试(二)

本文BLE测试主要依据RF-PHY.TS.5.0.0协议,且仅包含了NOC(正常工作条件)的不需添加干扰的测试项目。EOC(极限工作条件)需要根据实际情况(温度范围、湿度范围以及电源类型等)而定,干扰信号需要信号发生器,在这里不再展开。 BLE支持三个物理层,如下图: 其中S=2代表2个…

pyro 教程和实例 支持贝叶斯神经网络实现 (pyro 1.8以上的)bnn Bayesian Neural Network pyro ,人工智能

Example: Bayesian Neural Network — NumPyro documentation https://uvadlc-notebooks.readthedocs.io/en/latest/tutorial_notebooks/DL2/Bayesian_Neural_Networks/dl2_bnn_tut1_students_with_answers.html 注意&#xff0c;这些文档&#xff0c;也是有对应的版本的&…

记一次 .NET某实验室自动进样系统 崩溃分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友在微信上联系到我&#xff0c;说他们的程序在客户那边崩掉了&#xff0c;让我帮忙看下怎么回事&#xff0c;dump也拿到了&#xff0c;那就上手分析吧。 二&#xff1a;WinDbg 分析 1. 哪里的崩溃 既然是程序的崩溃&#xff0c…