【问题标题】:Tree/Graph Traversal: Find maximum value path树/图遍历:查找最大值路径
【发布时间】:2013-03-21 23:16:47
【问题描述】:

我正在尝试,给定一个具有整数值和 N 个级别的图 G,将从根到叶节点的值相加。找到这些路径值的最大和。子节点可以有多个父节点,这就是为什么它更像是一个图而不是一棵树。

例如,

我尝试通过 BFS 为一个小型 Java 小程序实现此功能,但我不确定这是不是最好的方法。是否有其他建议可以使其与节点数量保持一致,即 O(n)。我想不出任何可以扩展到 O(n) 的方法。有什么想法吗?

【问题讨论】:

  • 如果图有如上的金字塔形式,那么您可以将最大和从最深的节点传播到根节点。
  • 图是有向的吗?可以有周期吗?
  • 几乎是一棵树,除了允许多个父母这一事实

标签: java algorithm search graph tree


【解决方案1】:

您可以在线性时间内解决这个问题,方法是使用动态规划算法将来自底层节点的信息向上传播。

这样想:如果图只有一层,那么最佳答案必须是从该层中取最大值。另一方面,假设该图有 n + 1 层,并假设您已经(递归地)计算了最底层 n 层的最优解。在这种情况下,您可以通过查看顶层并为每个条目计算该条目的总和加上其任何直接子项(您已经预先计算)的最佳解决方案,从而找到整体最佳解决方案。所有这些中的最大值为您提供了总体最大值。

这种方法最终只访问每条边一次,因此总运行时间最终为 O(n + m),其中 n 是节点数,m 是边数。

希望这会有所帮助!

【讨论】:

  • 但这在某些情况下不起作用,除非我弄错了。例如,如果第二层除了一个有 1 之外全是 0。但是从一个 0 节点,那里的值 100 是 1 无法到达的。你的算法会沿着 1 的路径走,而沿着 0 的路径是最好的。
  • @kpscript- 我认为该算法适用于这种情况。您不会自上而下计算算法(因为正如您所见,它并不总是有效),而是自下而上。因此,当您计算顶层中的值时,您使用之前计算的值作为其下层的值。这意味着,如果从 0 到 100,您会预先计算出这个 0 实际上的值是 100。然后,您会在扫描顶层并查看下面的一层时检测到这一点。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2019-05-15
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多