Java 中从第一个节点到最后一个节点的受限路径数量2025年1月7日 | 5 分钟阅读 给定一个无向加权连通图。正整数 n 表示图中有 n 个节点,编号从 1 到 n。我们还提供了一个边数组,其中 edges[i] = [ui, vi, weighti] 表示节点 ui 和 vi 之间存在一条边,权重为 weight i。如果 0 <= i <= k-1,则节点 zi 和 zi+1 之间存在一条边,而节点 start 到节点 end 的路径是节点序列 [z0, z1, z2,..., zk],其中 z0 = start 且 zk = end。 路径上边的总权重决定了其长度。节点 n 到节点 x 的最短路径长度由变量 distanceToLastNode(x) 表示。如果一条路径还满足条件 distanceToLastNode(zi) > distanceToLastNode(zi+1),其中 0 <= i <= k-1,则该路径被认为是受限路径。返回节点 1 到节点 n 之间有多少受限路径。由于数量可能很多,请以 10^9 + 7 取模返回该数量。 示例 1 输入 ![]() int n = 5 int edge = [[1,2,3],[1,3,3],[2,3,1],[1,4,2],[5,2,2],[3,5,1],[5,4,10]] 输出 从起点到终点的受限路径数量为 3。 解释 节点编号以黑色显示在每个圆圈上,而 distanceToLastNode 值以蓝色显示。以下三条路径是受限的
示例 2 输入 ![]() int n = 7 int edge = [[1,3,1],[4,1,2],[7,3,4],[2,5,3],[5,6,1],[6,7,2],[7,5,3],[2,6,4]] 输出 从起点到终点的受限路径数量为 1。 解释 节点编号以黑色显示在每个圆圈上,而 distanceToLastNode 值以蓝色显示。以下三条路径是受限的
方法:最短路径计算(Dijkstra 算法)我们首先应用 Dijkstra 算法来确定每个节点到节点 n 的最短路径。通过使用优先队列(最小堆),可以有效地获得具有最短距离的下一个节点。我们使用计算出的距离来计算从节点 1 到节点 n 的受限路径数量。为了确保在处理一个节点之前,所有距离更短的节点都已得到处理,我们使用优先队列按它们与节点 n 的距离排序来处理节点。 如果对于每个节点 x 和每个邻居 y,从 y 到 n 的距离大于从 x 到 n 的距离(distance[y] > distance[x]),那么我们可以沿着受限路径从 x 移动到 y。然后将到达 x 的受限路径数量添加到到达 y 的受限路径数量中进行更新。 算法 步骤 1:为了表示图,创建一个邻接表。每个节点都将包含一个配对列表,其中每个配对由连接到相邻节点的边的权重组成。 步骤 2:对于输入中的每一条边,将匹配的配对添加到两个节点的邻接表中。 步骤 3:构建一个名为“distance”的数组,用于存储每个节点到节点 n 的最短路径。将所有距离初始化为无穷大,节点 n 除外,其值为 0。 步骤 4:将节点 n 的计数设置为 1 后,创建一个名为 ans 的数组来计算每个节点到节点 n 的受限路径数量。 步骤 5:使用优先队列(最小堆)实现 Dijkstra 方法。首先添加节点 n,确保其距离为 0。 步骤 6:当优先队列仍已填充时,应用 Dijkstra 算法。 在步骤 6.1 中提取距离最近的节点。 步骤 6.2:如果此距离大于节点记录的距离,则继续到下一个迭代。 步骤 6.3:如果发现到邻居的更短路径,则更新邻居的距离并将其添加到优先队列中。 步骤 6.4:如果节点之间的距离大于到当前节点的距离,则将当前节点的受限路径数量添加到邻居的受限路径数量中。 步骤 7:返回从节点 1 到节点 n 的受限路径数量。 实施文件名:RestrictedPaths.java 输出 The number of restricted paths is: 3 复杂度分析 上述代码的时间复杂度为 O((n+m)logn),空间复杂度为 O(n+m)。 |
在本节中,我们将学习如何在不使用算术运算符(*)的情况下在 Java 中将两个数字相乘。两个数字的乘积可以通过重复加法方法找到。这意味着将乘数加到自身上,直到乘数次。该方法...
阅读 3 分钟
数字图像分析和计算机视觉都严重依赖于图像处理。为了获得预期的结果,这需要图像的修改。亮度增强是图像处理的基本方法,可以使图像中的物体变亮,以便它们更... ...
7 分钟阅读
方法是代码块、一组语句或为了执行特定任务或操作而分组的代码集。它用于实现代码的可重用性。我们编写一次方法,然后多次使用它。我们...
阅读 12 分钟
?在 Java 中,我们可以使用 Calendar 或 LocalDate 类将日期添加 4 年。在本节中,我们将讨论这两种方法,并展示如何在 Java 代码中实现它们。使用 Calendar 类 Calendar 类是一个遗留类,它在 Java 中引入...
阅读 3 分钟
XOR(异或)运算是一种按位运算,它比较整数的对应位,并返回一个新的整数,其中每个位仅当输入整数中的一个对应位被设置时才被设置。在此上下文中,我们将...
阅读 4 分钟
在本节中,我们将学习 Java 中二叉树的右视图以及实现它的不同方法。在二叉树的右视图中,我们只打印当二叉树...时可见的节点。
阅读 4 分钟
为了将提供的字符读取到 CharBuffer 实例中,使用了 Java 的 Reader Class 的 read(CharBuffer) 方法。Java 可以获取一个称为 CharBuffer 的自定义缓冲区。nio 包,旨在高效地存储和操作字符序列。这种方法使得管理字符...
5 分钟阅读
Java 中的自定义类允许开发人员通过定义封装状态(属性)和行为(方法)的新类来创建自己的数据类型。这种灵活性是 Java 面向对象特性的基础,它能够创建复杂且可重用的代码。以下是有关自定义的详细指南...
5 分钟阅读
? 在 Java 中,ArrayList 通常用于存储和操作数据集合。有时,您可能需要将 ArrayList 作为参数传递给方法以执行操作或修改其内容。本文将指导您完成将……传递给方法的流程。
阅读 3 分钟
? 在 Java 中,线程可以分为守护线程和非守护线程(用户线程)。非守护线程是 Java 虚拟机(JVM)在关闭之前等待完成的典型线程,而守护线程是后台线程,它们不会阻止 JVM 在...时退出。
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India