当前位置: 首页 > 知识库问答 >
问题:

精确遍历n条边,从源节点到目标节点,找到最长路径

司空瑾瑜
2023-03-14

假设我们有一个带权的图,它是有向的和循环的。每个节点都有一条指向其他节点的边。没有将节点连接到自身的边。

现在我们有一个源节点和一个目标节点。我必须从源节点开始,精确地遍历n条边,最后到达目标节点。其中n是某个任意正整数(可能大于图中的节点数)。

当我们遍历一条边时,我们将它添加到我们的总和中(边权重都是正的)。现在我们到达目标节点的路径可以有循环。我们如何最大化我们的总和?

共有1个答案

申思远
2023-03-14

如果不允许循环,则问题是NP完全 - 请参阅 https://en.wikipedia.org/wiki/Longest_path_problem

假设允许的路径可以包括循环,例如A、B、C、B和C

对于 i = 1..N 计算,对于每个节点,终止于该节点的长度为 i 的最长路径的长度。将节点的长度和标识保存在 N 之前。

case i=0只是一个长度为0的路径,每个节点的前一个节点为空。

对于每个节点,通过考虑终止于该节点的每条边,从情况I得出情况i 1。

最后,为步骤N选择最长路径终止的节点,并使用之前节点的记录进行追溯。

(上面的内容实际上是为了计算任意两个节点之间的最长路径,因为我误读了这个问题,但您可以在开始时修改它,只扩展源节点开始的路径,最后只考虑目标节点结束的路径)。

在问题 ab=1,ac=2,bd=10,cd=1 之后添加的示例查找从 A 到 D 的最长 2 步路径。

i=0从A开始

i=1 到 B 的最长路径是长度 1,最后访问的 A. 最长到 C 的长度是长度 2,最后访问 A

i=2 最长到 A 是长度 4 最后一次访问 C. 最长到 D 是 11 最后一次访问 B (最大 1 10 从 B 和 2 1 从 C)。

我们希望长度为2,所以我们在这里停下来,计算d的答案。

 类似资料:
  • 我试图通过在MST中添加新顶点来更新MST。为此,我一直在关注Chin和Houck的“更新生成树”。http://www.computingscience.nl/docs/vakken/al/WerkC/UpdatingSpanningTrees.pdf 论文中的一个步骤要求我在两个给定顶点之间的路径中找到最大的边。我的想法是找到顶点之间所有可能的路径,然后从这些路径中找到最大的边。我一直在尝试在

  • 我有一个树类,看起来像: 其中树根包含指向其他子节点等的子节点的指针。我遇到的问题是,一旦它找到节点,我需要返回到该节点的路径。

  • 我有一棵看起来像上面的树,由一个链接结构表示: 我的目标是找到从根节点到叶节点的所有路径。 我的树遍历算法如下所示: 当我运行它时,我确信树正在按图所示构建。我已经测试过了。然而,我无法找出我的树遍历分割错误的原因。 我得到的输出是: 我已经在高度较小的树上测试了它,它是有效的。但是出于某种原因,它不适用于高度大于2的树。我认为这是树出了问题,我检查并打印了每个父级、左子级和右子级,它们打印出来如

  • 上节课说过Threejs场景对象Scene和各种子对象构成的层级模型就是一个树结构。如果你有一定的算法基础对树结构肯定会非常了解,如果你了解前端的DOM树结构也非常有助于本节课的学习,如果这些都不了解也没有关系,直接体验本节课的案例源码。 本文通过Three.js的一个类Group来介绍Threejs层级模型的概念,如果你对WebGL层级模型已经有一定的概念,直接把重点放在Group的了解上,如果

  • 在二叉树的morris遍历中,它使用每个右叶节点建立指向当前节点的连接。 假设我们以预先排序的方式遍历树,当到达叶节点时,我们如何判断是否遇到叶节点? 我们不能使用下面的行来检查:if(null==node.left 因为这里node.right指向当前节点,因为莫里斯算法。 一个好方法是,我们总是使用TreeNode对象中的一个字段将访问的节点标记为已访问,但是如果我们没有这个字段,在许多情况下

  • 问题内容: 我正在上图上进行广度优先搜索,以找到从到的最短路径。 我的密码 我需要跟踪BFS算法所经过的节点。遍历以到达节点6,例如。为此,我创建了一个名为&的列表,并尝试存储所访问节点的先前节点,以获取节点列表。被推荐 但这似乎不起作用。最短的路径是 在列表中我得到的是 这是部分正确的,但可以提供额外的收益。 If I again start from the first element of