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

news2024/11/27 0:41:26

来源:力扣(LeetCode)

描述:

给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边。请注意,两个点之间可能有 超过一条边 。

给你一个查询数组queries ,其中 queries[j] = [pj, qj, limitj] ,你的任务是对于每个查询 queries[j] ,判断是否存在从 pj 到 qj 的路径,且这条路径上的每一条边都 严格小于 limitj 。

请你返回一个 布尔数组 answer ,其中 answer.length == queries.length ,当 queries[j] 的查询结果为 true 时, answer 第 j 个值为 true ,否则为 false 。

示例 1:

1

输入:n = 3, edgeList = [[0,1,2],[1,2,4],[2,0,8],[1,0,16]], queries = [[0,1,2],[0,2,5]]
输出:[false,true]
解释:上图为给定的输入数据。注意到 01 之间有两条重边,分别为 216 。
对于第一个查询,01 之间没有小于 2 的边,所以我们返回 false 。
对于第二个查询,有一条路径(0 -> 1 -> 2)两条边都小于 5 ,所以这个查询我们返回 true

示例 2:

2

输入:n = 5, edgeList = [[0,1,10],[1,2,5],[2,3,9],[3,4,13]], queries = [[0,4,14],[1,4,13]]
输出:[true,false]
解释:上图为给定数据。

提示:

  • 2 <= n <= 105
  • 1 <= edgeList.length, queries.length <= 105
  • edgeList[i].length == 3
  • queries[j].length == 3
  • 0 <= ui, vi, pj, qj <= n - 1
  • ui != vi
  • pj != qj
  • 1 <= disi, limitj <= 109
  • 两个点之间可能有 多条 边。

前言

  关于并查集的详细说明可以参考 OI Wiki「并查集」或者 LeetBook「并查集」,本文不作过多说明。

方法:离线查询 + 并查集

  给定一个查询时,我们可以遍历 edgeList 中的所有边,依次将长度小于 limit 的边加入到并查集中,然后使用并查集查询 p 和 q 是否属于同一个集合。如果 p 和 q 属于同一个集合,则说明存在从 p 到 q 的路径,且这条路径上的每一条边的长度都严格小于 limit,查询返回 true,否则查询返回 false。

  如果 queries 的 limit 是非递减的,显然上一次查询的并查集里的边都是满足当前查询的 limit 要求的,我们只需要将剩余的长度小于 limit 的边加入并查集中即可。基于此,我们首先将 edgeList 按边长度从小到大进行排序,然后将 queries 按 limit 从小到大进行排序,使用 k 指向上一次查询中不满足 limit 要求的长度最小的边,显然初始时 k = 0。

  我们依次遍历 queries:如果 k 指向的边的长度小于对应查询的 limit,则将该边加入并查集中,然后将 k 加 1,直到 k 指向的边不满足要求;最后根据并查集查询对应的 p 和 q 是否属于同一集合来保存查询的结果。

代码:

class Solution {
public:
    int find(vector<int> &uf, int x) {
        if (uf[x] == x) {
            return x;
        }
        return uf[x] = find(uf, uf[x]);
    }

    void merge(vector<int> &uf, int x, int y) {
        x = find(uf, x);
        y = find(uf, y);
        uf[y] = x;
    }

    vector<bool> distanceLimitedPathsExist(int n, vector<vector<int>>& edgeList, vector<vector<int>>& queries) {
        sort(edgeList.begin(), edgeList.end(), [](vector<int> &e1, vector<int> &e2) {
            return e1[2] < e2[2];
        });

        vector<int> index(queries.size());
        iota(index.begin(), index.end(), 0);
        sort(index.begin(), index.end(), [&](int i1, int i2) {
            return queries[i1][2] < queries[i2][2];
        });

        vector<int> uf(n);
        iota(uf.begin(), uf.end(), 0);
        vector<bool> res(queries.size());
        int k = 0;
        for (auto i : index) {
            while (k < edgeList.size() && edgeList[k][2] < queries[i][2]) {
                merge(uf, edgeList[k][0], edgeList[k][1]);
                k++;
            }
            res[i] = find(uf, queries[i][0]) == find(uf, queries[i][1]);
        }
        return res;
    }
};

执行用时:440 ms, 在所有 C++ 提交中击败了96.64%的用户
内存消耗:107.6 MB, 在所有 C++ 提交中击败了80.54%的用户
复杂度分析
时间复杂度:O(ElogE+mlogm+(E+m)logn+n),其中 E 是 edgeList 的长度,m 是 queriesqueries 的长度,n 是点数。对 edgeList 和 queries 进行排序分别需要 O(ElogE) 和 O(mlogm),并查集初始化需要 O(n),并查集查询和合并总共需要 O((E+m)logn)。
空间复杂度:O(logE+m+n)。保存并查集需要 O(n) 的空间,保存 index 需要 O(m) 的空间,以及排序需要的栈空间。
author:LeetCode-Solution

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

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

相关文章

(附源码)springboot建达集团公司平台 毕业设计 141538

springboot建达集团公司平台 摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在网络的发…

DAMOYOLO:基于DAMOYOLO训练数据集详细教程

前段时间yolov7的推出引起一篇热潮&#xff0c;接着rmyolo紧跟潮流&#xff0c;后面阿里的达摩院也推出了自己的yolo算法&#xff0c;怎么说呢&#xff0c;damoyolo推出依旧不少天了&#xff0c;现在才写博客&#xff0c;因为damoyolo给我的体验感不是很好。 先看下DAMOYOLO的…

安科瑞模拟信号隔离器BM-DIS/I 经2000V隔离输出DC4-20mA 二线制

安科瑞 王晶淼/刘芳 1.信号隔离器功能 BM系列模拟信号隔离器可以对电流、电压等电量参数或温度、电阻等非电量参数进行高速精确测量&#xff0c;经隔离转换成标准的模拟信号输出。既可直接与指针表、数显表相接&#xff0c;也可以与自控仪表&#xff08;如PLC&#xff09;、各…

nginx负载均衡实战练习

1、简介 nginx是一个web服务器&#xff0c;反向代理服务器、开源并且高性能&#xff0c;社区里面有很多工程师在维护这个项目。可以在官网&#xff08;Index of /download/&#xff09;下载组件。而且nginx可以用来做流量转发&#xff0c;也是是负载均衡功能&#xff0c;分散单…

160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后…

富而喜悦一年一渡专属于你的特别的礼物!快来收!

过去的一年&#xff0c;你过得怎么样&#xff1f;是否有过艰难的逆流时刻&#xff0c;是否拥有过快乐和满足&#xff0c;又是否得到了成长和收获&#xff1f;富而喜悦2023一年一渡财富流新年主题活动就要给你一个礼物多多&#xff01;美美的“礼物”活动&#xff01; 为此&…

虹科分享 | 虹科Dimetix激光测距传感器如何利用反射来测量?(上)

-01-测量原理 ● 反射调制激光 采用激光振幅的高频调制&#xff0c;并评估这些调制的高频信号(脉冲串)的相位和距离。激光束在短间隔内被放大调制&#xff0c;这使得它能够非常迅速地测量单个脉冲包的与距离有关的时间偏移&#xff0c;而且还能测量单个波在调制包内相互之间的…

[附源码]Nodejs计算机毕业设计基于Web学术会议投稿管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Ims开机注册流程

目录 概述Ims注册时序图PhoneApp的启动过程Ims注册主要代码总结概述 IMS(IP Multimedia Subsystem)是IP多媒体系统, 是一种新的多媒体业务形式&#xff0c;ims service 结构主要包括 ImsService、ImsManager、MmTelFeatureConnection、ImsCallSession。其中&#xff1a; ImsS…

关于java 操作word的几种方式

1.apose word <dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-words</artifactId><version>22.4</version><type>pom</type> </dependency> 一般用来转换文件格式&#xff0c;对于读取创建段…

ArcGIS:Excel/Txt 文件生成点图层、属性表编辑的基本方法、属性表之间的连接(合并)和关联的操作、属性表的字段计算器的使用

目录 01 说明 02 实验目的及要求 03 实验设备及软件平台 03 实验原理 04 实验内容与步骤 01 说明 由于这次的作业是从word上粘贴过来&#xff0c;所以有一些格式修改不了&#xff0c;也没有时间和精力修改&#xff0c;所以没有详细目录等等&#xff0c;浏览的时候应该非常难受.…

前端基础(六)_CSS单位

CSS单位 px px 相对于显示器屏幕分辨率而言&#xff0c;值固定&#xff0c;计算比较容易 em em 相对长度单位 和父元素的字号大小有关系 font-size属性值而言 浏览器默认字号为16像素&#xff0c;未经调整的浏览器都符合1em16px div p都设置了font-size 那em就是随p特点&am…

2022-12-10 Set类型

set类型 新的存储需求&#xff0c;存储大量的数据&#xff0c;在查询方面提供更高的效率。 需要的存储结构&#xff1a;能够保存大量的数据&#xff0c;高效的内部存储机制&#xff0c;便于查询。 set类型&#xff1a;与hash存储结构完全相同&#xff0c;仅存储键&#xff0c…

考研证件照要求?如何制作考研用的证件照?

考研报报名网上确认环节&#xff0c;网上确认的时候需要准备电子照片。疫情阶段今天教给大家不需要出门就可以方便&#xff0c;快捷的制作合格的证件照&#xff0c;免去出门办理和审核不过的麻烦&#xff01; 考研证件照要求&#xff1a; 1. 本人近三个月内正面、免冠、无妆、彩…

基于遗传算法优化的lssvm回归预测matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

华为云WeLink协作文档,助您开启职场高效办公

Word、PPT、Excel&#xff0c;是大家在日常工作中最常用的Office三件套&#xff0c;很多人都经历过&#xff0c;写一份Word或者PPT&#xff0c;从v1写到v10&#xff0c;不断接收、汇总、修改同事提供的素材&#xff0c;不断向领导或客户发送最新审核版本&#xff0c;最后可能还…

前端框架搭建(四)改造导入项目插件流程【vite】

1.改造为函数 默认模板创建的vite.config.ts文件是这样的 我们在上一节也提到过&#xff0c;这样将使得vite的一些配置十分杂乱&#xff0c;无法统一进行管理&#xff0c;因此我们可以将其函数化 export default defineConfig(configEnv > {const viteEnv loadEnv(config…

Python基础语法之注释、缩进、数字类型、一句多行和多行一句等的讲解及演示(超详细 附源码)

Python是实现了平台无关性的高级程序设计语言&#xff0c;它是在源代码程序与各平台的机器码之间插入了一个虚拟机&#xff0c;也就是说源代码程序不再直接翻译成机器码&#xff0c;而是先编译成虚拟机的字节码&#xff0c;再将字节码解释成各平台可执行的机器码。 Python源代…

传输层协议 —— TCP(图解2)

​ 目录 一、前言 二、重传机制 1. 超时重传 2. 快速重传 3. SACK 4. D-SACK 三、滑动窗口 1. 发送方的滑动窗口 2. 程序是如何表示发送方的四个部分 3. 接收方的滑动窗口 四、流量控制 五、拥塞控制 1. 慢启动 2. 拥塞避免 3. 拥塞发生 4. 快速恢复 六、TCP…

Moonbeam生态说|聊聊平行链Bifrost及其与Moonbeam集成最新动态

「Moonbeam生态说」是Moonbeam中文爱好者社区联合Moonbeam中文高级大使组织的社区AMA活动。 该活动为已部署Moonriver或Moonbeam的项目方提供了在主流Moonbeam非官方中文社区内介绍自己的项目信息&#xff0c;包括&#xff1a;项目介绍、团队介绍、技术优势等&#xff0c;帮助社…