除了回溯之外,我如何在图表中找到最长的路径?

时间:2014-06-06 16:00:15

标签: algorithm graph path backtracking

我有一个形状为三角形的图形。

      8
     / \
    1   4
   / \ / \
  4   2   0
 / \ / \ / \
9   1   9   4

在上图中,最长路径为{8, 4, 2, 9}

我当前的算法计算相邻节点的最大数量并将其添加到列表中,然后计算该列表的总和。这适用于上图,但不适用于此场景:

      8
     / \
    0   1
   / \ / \
  4   0   4
 / \ / \ / \
9   99  3   4

我的算法会错误地通过{8,1,4,4},其中正确的最长路径为{8,0,4,99}

我能想到的唯一解决方案是 Backtracking 。我必须经历所有路径并计算最大路径,这将在一个巨大的图形中非常慢。这大约有100k节点图。

我的问题是我能做得比这更好吗?

2 个答案:

答案 0 :(得分:2)

从顶部开始。

对于每个节点,选择其父节点的最大值(上面连接的节点)并添加自己的值。

然后,在最后一行中,选择最大值。

这只会给你最长路径的值,但你可以通过简单地从底部选择的值开始并向上移动来轻松获得实际路径,总是选择更大的父路径。

节点的运行时间是线性的。

示例:

原件:

First example:              Second example:
      8                           8
     / \                         / \
    1   4                       0   1
   / \ / \                     / \ / \
  4   2   0                   4   0   4
 / \ / \ / \                 / \ / \ / \
9   1   9   4               9   99  3   4

输出:

First example:                Second example:
      8                             8
     / \                           / \
    9   12                        8   9
   / \ / \                       / \ / \
  13  14  12                    12  9   13
 / \ / \ / \                   / \ / \ / \
22  15  23  16               21  111  16  17

然后你选择第一个23和第二个111

要获取路径,我们的23-14-12-8对应9-2-4-8,第一个对应111-12-8-8,对应99-4-0-8,第二个对应{{1}}


我当然假设我们有一棵树,如上所述。对于一般图表,此问题为is quite a lot more difficult - NP-hard, to be exact

答案 1 :(得分:1)

您不需要在此处进行回溯 - 您可以使用广度优先搜索将您到目前为止找到的路径的max传播到相应的节点,逐级进行。

  • 从根开始,将其max设置为自己的值。
  • 逐级浏览节点
  • 对于每个节点,请检查存储在其父节点中的max。这些父母中可能有一个或两个。选择两个max的{​​{1}}个,添加节点本身的值,并将其存储在当前节点中
  • 当完成图表的路径时,结果如下所示:

最大图表:

max

要恢复路径,请在底层找到最大值。这是您路径的最后一个节点。您可以从max(111)开始重建最大图和原始路径,减去值(99),在max graph中查找结果(111-99 = 12),然后继续到该节点。你达到顶峰:

  • 111 - 99 = 12 - 取99
  • 12 - 4 = 8 - 选择4
  • 8 - 0 = 8 - 取0
  • 8是根 - Take 8

这为您提供了反向的最大路径。请注意,这可能不是唯一的路径(想想填充相等值的图表,看看可能有多个最大路径)。但是,在这种情况下,您将恢复的任何路径都将满足最大路径要求。