1697. 检查边长度限制的路径是否存在

2024-02-01 06:04

本文主要是介绍1697. 检查边长度限制的路径是否存在,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem: 1697. 检查边长度限制的路径是否存在

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一个关于边长度限制路径存在性的问题。给定一个无向图,每条边都有一个长度。同时给定一些查询,每个查询包含两个节点和一个长度限制。需要判断是否存在一条路径连接这两个节点,并且路径上的边的长度都不超过限制。

可以使用并查集来解决这个问题。首先对边按照长度进行排序,然后对查询按照限制长度进行排序。然后使用并查集来判断两个节点是否在同一个连通分量中。遍历查询,对于每个查询,将小于等于限制长度的边添加到并查集中,然后判断两个节点是否在同一个连通分量中。

解题方法

创建一个大小为n的数组father,用于存储每个节点的父节点。
创建一个大小为m的二维数组questions,用于存储查询的信息。其中questions[i][0]表示查询的起始节点,questions[i][1]表示查询的终止节点,questions[i][2]表示查询的限制长度,questions[i][3]表示查询的索引。
对边的列表edgeList按照边的长度进行排序。
对查询的列表queries按照限制长度进行排序。
使用并查集的find和union操作,遍历查询列表,对于每个查询,将小于等于限制长度的边添加到并查集中,然后判断起始节点和终止节点是否在同一个连通分量中。
将判断结果存储到一个大小为m的布尔数组ans中,ans[i]表示第i个查询的结果。
返回ans作为查询结果。

复杂度

时间复杂度:

排序边和查询的时间复杂度为 O ( E l o g E + M l o g M ) O(ElogE + MlogM) O(ElogE+MlogM),其中E为边的数量,M为查询的数量。并查集的时间复杂度为 O ( l o g N ) O(logN) O(logN),其中N为节点的数量

空间复杂度:

O ( N ) O(N) O(N),用于存储并查集的father数组。

Code

class Solution {public int MAXN = 100001;public int[][] questions = new int[MAXN][4];public int[] father = new int[MAXN];public void build(int n) {for (int i = 0; i < n; i++) {father[i] = i;}}public int find(int i) {if (i != father[i]) {father[i] = find(father[i]);}return father[i];}public boolean isSameSet(int x, int y) {return find(x) == find(y);}public void union(int x, int y) {father[find(x)] = find(y);}public boolean[] distanceLimitedPathsExist(int n, int[][] edgeList, int[][] queries) {Arrays.sort(edgeList, (a, b) -> (a[2] - b[2]));int k = edgeList.length;int m = queries.length;for (int i = 0; i < m; i++) {questions[i][0] = queries[i][0];questions[i][1] = queries[i][1];questions[i][2] = queries[i][2];questions[i][3] = i;}Arrays.sort(questions, 0, m, (a, b) -> a[2] - b[2]);build(n);boolean[] ans = new boolean[m];for (int i = 0, j = 0; i < m; i++) {for (; j < k && edgeList[j][2] < questions[i][2]; j++) {union(edgeList[j][0], edgeList[j][1]);}ans[questions[i][3]] = isSameSet(questions[i][0], questions[i][1]);}return ans;}
}

这篇关于1697. 检查边长度限制的路径是否存在的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

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编程采用默认安装路径,

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.