我有一个简单的,非决定性的树T
。我应该找到一个名为A
的路径和另一个名为B
的路径A
和B
没有共同的顶点。 perpuse是最大化Len(A)*Len(B)
。
我认为这个问题是分区问题的模拟器,除了分区问题你有一个集合,但在这里你有一个等价集。解决方案是找到Len(A) ~ Len(B) ~ [n-1/2]
的两条未交叉路径。这是correnct?我应该如何实现这样的算法呢?
答案 0 :(得分:0)
首先。我认为你是以错误的方式看待这个问题。据我了解,您有graph相关问题。你做的是
- 构建最大生成树并找到长度L.
- 现在,你说这两条路径不能有任何共同的顶点,所以我们必须删除一条边来实现这个目的。我假设图中的每个边都是1.因此,在移除边之后,两个路径A和B的总和为L-1。现在的问题是你必须删除一条边,使len(a)和len(b)的乘积最大化。你可以通过移除L中大多数'middel'的边缘来实现这一点。为什么,问题与优化具有固定周长的矩形区域相同。可以找到关于该主题的简短YouTube视频here。
醇>
请注意,如果边缘轮廓不等于1,那么您就会遇到更难的问题,因为可能存在多个最大生成树。但你可以用不同的方式拆分它们,如果是这种情况,请给我回信,然后我会考虑一个解决方案,但我手头没有。
祝你好运。
答案 1 :(得分:0)
我认为,如果路径长度只是路径中的链接数量(因此链接不具有权重),那么动态编程解决方案几乎易于处理。
离开工作。在每个节点,您需要跟踪限制在子节点的子树的最佳解决方案对,并且对于每个k,最佳解决方案的长度为k的路径终止于该节点,第二条路径为最大长度在该节点下方的某处,而不是触及路径。
给定节点的所有后代的这些信息,您可以为该节点生成类似的信息,因此一直向前行进。
如果您考虑的树实际上只是一行节点,您可以看到需要这么多信息。一系列节点的最佳解决方案是将它分成两部分,所以如果你只得到线条长度为2n + 1的最佳解决方案,你就不会拥有一条线所需的构建块。长度2n + 3。