LeetCode_dijkstra 算法_困难_882.细分图中的可到达节点

news2025/7/7 23:36:53

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

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

图用由边组成的二维数组 edges 表示,其中 edges[i] = [ui, vi, cnti] 表示原始图中节点 ui 和 vi 之间存在一条边,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:
在这里插入图片描述
输入: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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reachable-nodes-in-subdivided-graph

2.思路

(1)dijkstra 算法
思路参考本题官方题解。

3.代码实现(Java)

//思路1————dijkstra 算法
class Solution {
    public int reachableNodes(int[][] edges, int maxMoves, int n) {
        List<int[]>[] adList = new List[n];
        for (int i = 0; i < n; i++) {
            adList[i] = new ArrayList<int[]>();
        }
        for (int[] edge : edges) {
            int u = edge[0], v = edge[1], nodes = edge[2];
            adList[u].add(new int[]{v, nodes});
            adList[v].add(new int[]{u, nodes});
        }
        Map<Integer, Integer> used = new HashMap<Integer, Integer>();
        Set<Integer> visited = new HashSet<Integer>();
        int reachableNodes = 0;
        PriorityQueue<int[]> pq = new PriorityQueue<int[]>((a, b) -> a[0] - b[0]);
        pq.offer(new int[]{0, 0});

        while (!pq.isEmpty() && pq.peek()[0] <= maxMoves) {
            int[] pair = pq.poll();
            int step = pair[0], u = pair[1];
            if (!visited.add(u)) {
                continue;
            }
            reachableNodes++;
            for (int[] next : adList[u]) {
                int v = next[0], nodes = next[1];
                if (nodes + step + 1 <= maxMoves && !visited.contains(v)) {
                    pq.offer(new int[]{nodes + step + 1, v});
                }
                used.put(encode(u, v, n), Math.min(nodes, maxMoves - step));
            }
        }

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

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

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

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

相关文章

使用 Next.js 搭建 Monorepo 组件库文档

文章为稀土掘金技术社区首发签约文章&#xff0c;14 天内禁止转载&#xff0c;14 天后未获授权禁止转载&#xff0c;侵权必究&#xff01; 阅读本文你将&#xff1a; 使用 pnpm 搭建一个 Monorepo 组件库使用 Next.js 开发一个组件库文档changesets 来管理包的 version 和生成…

Linux进程总结详解(上——初识)

Linux进程 文章目录Linux进程前言——先从硬件和软件谈起一、冯诺依曼体系结构二、操作系统概念一、进程介绍概念进程控制块查看进程通过系统创建进程二、进程状态1.内核代码如下&#xff1a;总结前言——先从硬件和软件谈起 一、冯诺依曼体系结构 定义&#xff1a;数学家冯诺…

【数据结构】二叉树的遍历

目录☀️二叉树的构建☀️二叉树的遍历&#x1f33b;前序遍历&#x1f33b;中序遍历&#x1f33b;后序遍历☀️完整代码展示☀️二叉树的构建 便于理解二叉树的遍历&#xff0c;这里我们手动简单构建一个二叉树&#xff0c;当然&#xff0c;此处二叉树的构建并不是真正二叉树的…

C++类与对象(一)

目录 一、面向过程和面向对象认识 二、类的引入 三、类的定义 类的两种定义方式&#xff1a; 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1 如何计算类对象的大小​​​​​ 7.2 类对象的存储方式 7.3 结…

SpringBoot+Mybaits搭建通用管理系统实例十一:数据缓存功能实现

一、本章内容 使用ehcache实现系统缓存功能,并配置实现mybatis的二级缓存,自定义分页缓存的key,识别实体类型,并根据实体属性的配置,组合生成key值用于标识缓存数据。 完整课程地址二、开发视频 SpringBoot+Mybaits搭建通用管理系统实例三:缓存管理功能实现 三、缓存配置 …

滚动吧,数字

朋友有个需求关于金币滚动效果&#xff0c;网上也有很多教程&#xff1b;但多不太符合他的需求&#xff0c;所有利用空余时间帮他做了一个通用组件。 效果图如下: 1、按照次数和速度进行&#xff0c;对应的滚动效果。 2、缓动效果可以根据自己的情况进行修改。 项目地址&#x…

windows安装VMware虚拟机(附带CentOS7部署)

软件下载 链接&#xff1a;https://pan.baidu.com/s/1Vw2Bilf9uf-EYR6_MR86aA?pwdd2qr 提取码&#xff1a;d2qr VMware安装 通你上述链接下载VMware安装包&#xff0c;没有特别选项&#xff0c;选安装位置无脑下一步安装&#xff0c;安装完成后会提示你输入激活码&#xf…

Java中的OpenCV-图像处理

我们将在本文中介绍以下高级图像处理操作&#xff1a;Canny 边缘检测轮廓和形状识别Canny 边缘检测&#xff1a;Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年开发的。它是一个多阶段算法&#xff0c;我们将按如下方式经历每个阶段&#xff1a;噪声…

Java与GitLab OpenAPI交互

通过Gitlab Open api代码来操作代码的合并及关闭&#xff0c;项目的模板生成........ 方式一&#xff1a; 使用java-gitlab-api(推荐) 接口文档Java Gitlab API Documentation <dependency> <groupId>org.gitlab</groupId> <art…

49 多个 classloader 加载的同类限定名的Class 在 jhat 中显示不全

前言 呵呵 这是在之前 排查一个 flink 的相关问题的时候 发现的一个问题 flink 默认的 job 隔离是基于 Classloader 来进行隔离的 直到 最近才有时间来看一下 这个问题的原因, 究其代码 也还是比较容易找到 大致记录一下 以下内容, 截图 基于 jdk8 测试用例 /*** …

要闻 | 人大金仓重磅亮相2022南京软博会

“软件赋能 数智转型”&#xff0c;2022中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会&#xff08;下称“南京软博会”&#xff09;于11月23至25日顺利举行。人大金仓重磅亮相本次展会&#xff0c;并受邀出席同期召开的2022中国&#xff08;南京&#xff…

【LeetCode每日一题】——37.解数独

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 困难 三【题目编号】 37.解数独 四【题目描述】 编写一个程序&#xff…

抢先看!阿里发布2023最新版分布式核心小册,GitHub标星破已千万

什么是分布式 一个分布式系统你可以看做是一组计算机系统一起工作&#xff0c;而在终端用户的视角看过去&#xff0c;就像一台计算机在工作一样 。 这组一起工作的计算机&#xff0c;拥有共享的状态 &#xff0c;他们同时运行&#xff0c;独立机器的故障不会影响整个系统的正常…

1、认识时间复杂度和简单的排序算法

目录时间复杂度选择排序冒泡排序异或交换解释案例综上插入排序二分查找拓展对数器时间复杂度 如果一个操作时间和数据量没有关系&#xff0c;则是常数时间的操作 比如一个数组arr[n]这就是算一个偏移量&#xff0c;然后找到这个位置的值&#xff0c;这就是常数时间&#xff0c…

力扣(LeetCode)882. 细分图中的可到达节点(C++)

spfa 将边细分成节点&#xff0c;如果一条边细分出 nnn 个结点&#xff0c;那么边的两个端点距离 n1n1n1 &#xff0c;边长 n1n1n1。提示中给出&#xff0c;一共 300030003000 个初始结点&#xff0c;无向边的数目小于等于 100001000010000 &#xff0c;这是提示我们最多有 20…

服务器怎么远程连接控制

服务器怎么远程连接控制 我是艾西&#xff0c;还是有很多小白同学问我服务器怎么远程连接。那么今天我们重点来教教大家如何用电脑远程服务器配上图文教程&#xff0c;让不懂的新手小白一看就会&#xff0c;分分钟上手教程 远程服务器需要一台电脑俗称“PC”就是我们自己平时经…

红外遥控视力自动检测系统的设计与实现

红外线视力检测系统的设计与实现 实现方法 分为两部分 上位机-------------串口通讯-------------下位机 上位机&#xff1a;使用LabVIEW软件编写窗口软件。 串口通讯&#xff1a;USB线进行链接通讯。 下位机&#xff1a;AT89C52单片机开发板 说明&#xff1a;Labvi…

46-pytest-分布式插件pytest-xdist使用

分布式插件pytest-xdist使用前言安装插件分布式用例设计原则使用示例测试报告按一定顺序执行前言 本篇来学习下在pytest中分布式执行测试用例&#xff0c;以节省测试时间。 安装插件 pip install pytest-xdist分布式用例设计原则 用例之间是独立的&#xff0c;用例之间没有…

学生护眼台灯哪个牌子最好?2022双十二4款儿童护眼写字灯推荐

现在的孩子学业压力越来越大了&#xff0c;眼睛也是长期高强度使用&#xff0c;不堪重负&#xff0c;如果不注意保护&#xff0c;加上年龄偏小身体器官尚未发育完全&#xff0c;极易出现各种眼睛问题。所以对于经常晚上看书写字的学生群体来说&#xff0c;有一个健康护眼的照明…

OpenGL ES 学习(二) -- 渲染模式和GLSL

上一章&#xff0c;我们学习了 OpenGL 的基本知识&#xff0c;这一章&#xff0c;一起学习OpenGL的渲染模式和渲染语言GLSL。 一. 渲染流程 OpenGL的渲染流程如下图所示&#xff1a; 从这里看出&#xff0c;OpenGL 需要使用顶点着色器&#xff0c;先绘制好轮廓&#xff0c;再…