【882. 细分图中的可到达节点】

news2025/7/10 4:02:48

来源:力扣(LeetCode)

描述:

  给你一个无向图(原始图),图中有 n 个节点,编号从 0n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。

  图用由边组成的二维数组 edges 表示,其中 edges[i] = [ui, vi, cnti] 表示原始图中节点 uivi 之间存在一条边,cnti 是将边 细分 后的新节点总数。注意,cnti == 0 表示边不可细分。

  要 细分[ui, vi] ,需要将其替换为 (cnti + 1) 条新边,和 cnti 个新节点。新节点为 x1, x2, ..., xcnti ,新边为 [ui, x1], [x1, x2], [x2, x3], ..., [xcnti+1, xcnti], [xcnti, vi]

  现在得到一个 新的细分图 ,请你计算从节点 0 出发,可以到达多少个节点?如果节点间距离是 maxMoves 或更少,则视为 可以到达

给你原始图和 maxMoves ,返回 新的细分图中从节点 0 出发 可到达的节点数

示例 1:
1

输入:edges = [[0,1,10],[0,2,1],[1,2,2]], maxMoves = 6, n = 3
输出:13
解释:边的细分情况如上图所示。
可以到达的节点已经用黄色标注出来。

示例 2:

输入:edges = [[0,1,4],[1,2,6],[0,2,8],[1,3,1]], maxMoves = 10, n = 4
输出:23

示例 3:

输入:edges = [[1,2,4],[1,4,5],[1,3,1],[2,3,4],[3,4,5]], maxMoves = 17, n = 5
输出:1
解释:节点 0 与图的其余部分没有连通,所以只有节点 0 可以到达。

提示:

  • 0 <= edges.length <= min(n * (n - 1) / 2, 104)
  • edges[i].length == 3
  • 0 <= ui < vi < n
  • 图中 不存在平行边
  • 0 <= cnti <= 104
  • 0 <= maxMoves <= 109
  • 1 <= n <= 3000

方法:Dijkstra 算法

思路

  当图中只存在原始节点而不存在细分节点时,此题可以用 Dijkstra 算法解决:将输入的 edges 转换成邻接表 adList,维护一个小顶堆 pq 可以依次计算出图中的起点到各个点最短路径,从而计算出可到达节点。pq 中的元素为节点以及起点到该节点的路径长度,并以路径长度为比较元素。每次取出未访问过的节点中的路径最短的节点,并访问其邻接点,若路径长度仍小于等于 maxMoves 且未访问过,可将其放入 pq,直至 pq 为空或 pq 最短路径大于 maxMoves。

  但当每条边上都加入细分节点后,需要考虑细分节点是否可达。用一个哈希表 used 记录各条边上的细分节点的可达情况,键为二元点对 (u, v) 表示从点 u 到点 v 的边,值为这条边上的可达细分节点数。注意在计算细分节点时,是考虑单向的情况,即会分别计算 used[(u, v)] 和 used[(v,u)],并且这两个值不一定相等。计算 used 时,是要在访问路径最短的节点 u 的邻接节点 v 时计算。如果邻接节点的路径长度小于等于 maxMoves,说明这条边上的细分节点都可达,否则只有一部分可达,且这部分细分节点是靠近节点 u 的。

  计算总的可达节点时,需要加上细分节点的部分。但每条边上的细分节点可能会被计算过两次,即 used[(u, v) 和 used[(v, u)],他们分别是是靠近 u 开始计算的和靠近 v 开始计算的,需要对这两部分进行去重。

代码:

class Solution {
public:
    int encode(int u, int v, int n) {
        return u * n + v;
    }

    int reachableNodes(vector<vector<int>>& edges, int maxMoves, int n) {
        vector<vector<pair<int, int>>> adList(n);
        for (auto &edge : edges) {
            int u = edge[0], v = edge[1], nodes = edge[2];
            adList[u].emplace_back(v, nodes);
            adList[v].emplace_back(u, nodes);
        }

        unordered_map<int, int> used;
        unordered_set<int> visited;
        int reachableNodes = 0;
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
        pq.emplace(0, 0);
        while (!pq.empty() && pq.top().first <= maxMoves) {
            auto [step, u] = pq.top();
            pq.pop();
            if (visited.count(u)) {
                continue;
            }
            visited.emplace(u);
            reachableNodes++;
            for (auto [v, nodes] : adList[u]) {
                if (nodes + step + 1 <= maxMoves && !visited.count(v)) {
                    pq.emplace(nodes + step + 1, v);
                }
                used[encode(u, v, n)] = min(nodes, maxMoves - step);
            }
        }

        for (auto &edge : edges) {
            int u = edge[0], v = edge[1], nodes = edge[2];
            reachableNodes += min(nodes, used[encode(u, v, n)] + used[encode(v, u, n)]);
        }
        return reachableNodes;
    }
};

2

复杂度分析
时间复杂度:O(E×log⁡V),V 为节点数,即 n,E 为输入 edges 的长度。邻接表 adList 的时间复杂度为 O(E),Dijkstra 算法的时间复杂度为 O(E×log⁡V)。总的时间复杂度为 O(E×log⁡V)。
空间复杂度:O(V+E),邻接表 adList 的空间复杂度为 O(E), pq 的空间复杂度为 O(E), visited 的空间复杂度为 O(V),used 的空间复杂度为 O(E),总的空间复杂度为 O(V+E)。
athor:力扣官方题解

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

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

相关文章

进程替换与复制

目录进程替换基础知识什么是进程替换进程替换函数函数使用execlexeclpexecleexecvexecvpexecve进程替换基础知识 什么是进程替换 进程替换&#xff1a;把当前进程换为其他进程执行。&#xff08;其他进程&#xff1a;创建新进程&#xff0c;生成可执行程序&#xff0c;装在进…

Android 13 Wi-Fi状态机流程及Log分析

本文基于Android 13源码解读,对Wi-Fi状态机调用流程进行梳理,并结合Log进行分析,便于大家理解Wi-Fi模块调用流程。 梳理出Wi-Fi状态机共有如下几种状态: mConnectableState mConnectingOrConnectedState mL2ConnectingState mL2ConnectedState mL3ProvisioningState …

【机器学习项目实战10例目录】项目详解 + 数据集 + 完整源码

前言 大家好&#xff0c;我是阿光。 本专栏整理了《机器学习项目实战10例》&#xff0c;内包含了各种不同的入门级机器学习项目&#xff0c;包含项目原理以及源码&#xff0c;每一个项目实例都附带有完整的代码数据集。 正在更新中~ ✨ &#x1f6a8; 我的项目环境&#xff…

《计算机体系结构量化研究方法第6版》1.4 技术趋势

引入 1、以下五种技术是现代计算机实现所不可或缺的。 &#xff08;1&#xff09;集成电路逻辑技术。晶体管密度每年大约增加35%&#xff0c;相当于每4年翻两番。晶片大小的增长速度比较难以预测&#xff0c;也慢一些&#xff0c;增速为每年10%~ 20%。两者综合起来&#xff0c…

【Linux】CentOS 7安装 MySQL

1. 更改Centos YUM 源 1&#xff09; 备份 yum 源配置文件 &#xff08;在根目录下执行&#xff09; mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2&#xff09;将官方的 yum 源换成阿里的yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo…

Day12--渲染二级和三级分类列表

1.动态渲染右侧的二级分类列表 我的操作&#xff1a; 1》在cate.vue中&#xff1a; 2》效果图&#xff1a; *********************************** *********************************** *********************************** 2.循环渲染右侧二级分类列表的 UI 结构&#xff1…

RabbitMQ快速入门

中间件&消息队列 中间件概述 中间件&#xff08;Middleware&#xff09;是处于操作系统和应用程序之间的软件&#xff0c;也有人认为它应该属于操作系统中的一部分。人们在使用中间件时&#xff0c;往往是一组中间件集成在一起&#xff0c;构成一个平台&#xff08;包括开…

你不能错过的【Python爬虫】测试3(爬取所有内容 + 完整源代码 + 架构 + 结果)

目录 一、主要工具包 以及 版本二、架构展示三、各部分code3.1 yjs.py (重要)3.2 items.py3.3 middlewares.py3.4 pipelines.py3.5 settings.py3.6 start.py四、结果展示一、主要工具包 以及 版本 scrapy:2.7.1版本(这里主要用到的工具包) 二、架构展示 三、各部分code 3…

MySQL体系-日志与MVCC(源码层面)

MySQL 本身具备生产binlog日志的功能&#xff0c;在InnoDB存储引擎中&#xff0c;为了持久性有了redo log,为了原子性和隔离性有了undo log&#xff0c;最终通过redo log undo log 保证了一致性&#xff1b; 我先画一个InnoDB操作流程&#xff0c;先简单的了解下它们的工作机制…

基于S2SH的保险业务管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86467452 主要使用技术 SpringStruts2HibernateJSPJSCSSMysql 功能介绍 本系统旨在为当今的保险行业提供一套综合性的管理系统业务&#xff0c;系统的主要用户为保险的购买者以及系统的管理…

10.实用调试技巧

一、调试 1.调试的定义 调试&#xff08;英语&#xff1a;Debugging / Debug&#xff09;&#xff0c;又称除错&#xff0c;是发现和减少计算机程序或电子仪器设备中程序 错误的一个过程。 2.调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产…

Linux系统编程(三)——Linux下的进程

第一篇中总结了系统的环境搭建&#xff0c;第二篇中学习了系统的一些IO函数&#xff0c;接下来就深入到了Linux下的进程线程的实现。 目录 0x01 进程概述 一、进程的信息 二、程序与进程 三、并行与并发 四、进程控制块PCB 0x02 进程状态转换 一、进程的状态 二、进程相…

【C++】哈希-bitset位图与模拟

目录 1.位图 1.1什么是位图 1.2位图的作用 2.bitset应用 2.1bitset构造 2.2bitset成员函数与使用 3.bitset模拟实现 构造函数 set reset test flip count size none,any 1.位图 在前文中我们介绍了哈希的一些内容&#xff0c;接下来我们介绍一个新奇的玩意&am…

回归问题原理

回归问题是一种常见的监督机器学习任务&#xff0c;在很多领域均有广泛应用。其典型应用包括销量预测、库存预测、股票价格预测、天气预测等。本问将讨论线性回归&#xff0c;包括线性回归模型的目标函数&#xff08;损失函数和正则函数&#xff09;、线性回归模型的优化求解、…

【一包通刷】晶晨S905L3A/B_完美AI语音线刷包_打开ADB_ROOT权限

【9.0一包通刷】晶晨S905L3A/B_完美AI语音线刷包_默认打开ADB ROOT权限支持游戏启动_万物互联启动动画 适用型号&#xff1a;M401A、CM311-1a、CM311-1sa、B863AV3.1-M2、B863AV3.2-M、UNT403A、M411A等等&#xff1b; 系统版本&#xff1a;Android9 系统桌面&#xff1a;超…

【机器学习项目实战10例】(五):基于随机森林的假新闻检测项目

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、基于随机森林的假新闻检测项目二、数据集介绍三、导包四、加载数据集五、划分训练集、测试集六、构建模型七、精度测试八、网格搜索一、基于随机森林的假新闻检测项目 在当今时代,传播错误信息已经成为一个真正的问题,…

初试hashlib加密模块

文章目录 一、加密解密基础二、使用hashlib模块实现数据加密(一)加密数据1、编写程序,实现功能2、运行程序,查看结果(二)登录加密校验1、编写程序,实现功能2、运行程序,查看结果一、加密解密基础 二、使用hashlib模块实现数据加密 (一)加密数据 1、编写程序,实现功…

【DeepLearning 8】Self-Attention自注意力神经网络

&#x1f34a;本文主要介绍了Self-Attention产生的背景以及解析了具体的网络模型 一、Introduction 很多时候&#xff0c;我们需要输入的数据非常的复杂&#xff0c;难以用统一、固定长度的向量来表示。比如NLP中长短不一的句子。此外&#xff0c;我们需要输出的数据有时候也会…

Spring Security中文文档

Spring Security中文文档 来源&#xff1a;https://www.springcloud.cc/spring-security.html#overall-architecture 作者 Ben Alex&#xff0c;Luke Taylor&#xff0c;Rob Winch&#xff0c;Gunnar Hillert&#xff0c;Joe Grandja&#xff0c;Jay Bryant5.1.2.RELEASE…

使用Redis查询数据库数据增加访问速度小案例

黑马B栈网课案例 文章目录案例需求&#xff1a;SQL建表所需jar包项目结构代码展示index.html首页面domainProcince.javadaoProvinceDaoProvinceDaoImplserviceProvinceServiceProvinceServiceImplservletJDBC工具类配置文件jedis.propertiesdruid.properties案例需求&#xff1…