使用k个顶点的树中最长的路径

时间:2017-03-10 18:51:27

标签: algorithm tree dynamic-programming

我们有一个包含 Sub Select_Range() Dim Fm As Range, Av As Range, rng As Range, rngEnd As Range Dim s As String, x s = "February 2017 (IN/OUT)" Set Fm = Rows(8).Find(s, LookIn:=xlValues) If Not Fm Is Nothing Then Set Av = Fm.MergeArea Set rng = Av.Offset(3).Resize(, Av.Columns.Count) Set rngEnd = rng.Cells(rng.Rows.Count, rng.Columns.Count) rngEnd.Select End If 个节点的树,我们需要找到n (2 <= n <= 1000) 不同的顶点,以便通过所有这些顶点的路径具有最大长度。

注意:

  • 路径应从顶点k (1 <= k <= 100 and k <= n - 1)开始,也在顶点1处完成。
  • 算法必须只返回最大路径的长度(不需要路径本身)。
  • 顶点之间的路径必须是最短路径。
  • 边缘的重量有以下限制:1

我们假设我们有以下带0 <= w <= 100000个顶点的树:
enter image description here

我们需要找到n = 5个顶点,它们将为我们提供最长的路径。

对于此树,最大路径如下:
1⟶5⟶2⟶4⟶1

总长度为k = 3 因此,对于该特定树,我们必须打印13 + 18 + 10 + 5 = 46作为结果。

我想出了一个类似贪婪/ dp的解决方案 首先,我们解决46的问题,并在链表k = 1中记住此解决方案。之后,我们尝试通过尝试所有剩余的1 -> v -> 1顶点并将其插入当前路径k = 2n - 2来解决1 -> u -> v -> 1的问题。在浏览了所有顶点之后,我们选择了给出最佳结果的顶点。然后我们继续解决1 -> v -> u -> 1

问题是看起来this solution不正确,因为它未通过this problem的测试。
我不能证明我的解决方案是正确的,我不能反驳它。我所做的就是生成数以百万计的不同随机树,在所有这些情况下,我的聪明解决方案都与强力解决方案相匹配。

现在我所有的努力都是为了产生一个反方法,我的方法会失败,但如果它是正确的,我很高兴看到为什么它是正确的。

1 个答案:

答案 0 :(得分:2)

问题是您的代码只存储并扩展了一个最大长度的k-solutions。

在下面的示例中,验证路径1-> 5-> 3-> 1是否具有最大长度。该路径的最大长度延伸是1-> 5-> 3-> 4-> 1和1-> 5-> 2-> 3-> 1,两者的长度均为10。路径1-> 5-> 2-> 4-> 1具有长度12。

path containing five vertices