Algorithm 以最小成本从具有N个节点的树中选择K个节点

Algorithm 以最小成本从具有N个节点的树中选择K个节点,algorithm,Algorithm,有一棵树有N个节点和N-1条边(使之成为一棵树)。每个节点都有一个权重W(i)。如何选择仍然包含原始树根的大小为K个节点的子树?我必须这样做,以使选择此“子树”的“成本”最小化,其中成本定义为保留的所有边的权重之和 我想我以前做过这样的问题,它看起来像DP/递归。但是,当每个节点限制为2个子节点时,我知道如何处理它。您已经定义了函数成本(n,i),这意味着保持i个节点从节点n开始的最小成本。您可以在其中一个子项中从i=0迭代到n,然后将其余部分交给另一个子项。然而,由于每个节点可以有无限数量的子

有一棵树有N个节点和N-1条边(使之成为一棵树)。每个节点都有一个权重W(i)。如何选择仍然包含原始树根的大小为K个节点的子树?我必须这样做,以使选择此“子树”的“成本”最小化,其中成本定义为保留的所有边的权重之和

我想我以前做过这样的问题,它看起来像DP/递归。但是,当每个节点限制为2个子节点时,我知道如何处理它。您已经定义了函数成本(n,i),这意味着保持i个节点从节点n开始的最小成本。您可以在其中一个子项中从i=0迭代到n,然后将其余部分交给另一个子项。然而,由于每个节点可以有无限数量的子节点,有没有办法解决这个问题


感谢

对于给定的节点,您希望使用其子节点的成本(n,i)计算成本(n,i)。将子项从0..K开始编号,您将拥有另一个动态程序。在第j阶段,您希望仅使用子项0..j计算出可能的最佳成本集(n,i)

我一直在考虑编写类似这样的代码,同时又在玩弄机器学习(只是为了好玩,我想编写一些程序,通过安装两个Weka分类器而不是一个来查找异常)。这与您的目的类似吗?

DP解决方案(可能与mcdowella描述的类似,也可能与mcdowella描述的不同):

让根节点编号为0。其余节点可以任意编号(但最好的方法是逐层逐个编号)

f(i,j)
表示当我们考虑索引大于i的所有同级节点加上任何子节点(如果适用)并从有效节点中选择j节点时的最小成本

f(i, 0) = 0            // i can be anything, even NOT_FOUND
f(NOT_FOUND, j) = +Inf // j > 0
f(i, j) = min(f(x, j), // Node i not chosen
              min[r = 0 to j - 1] (f(x, j - 1 - r) + f(y, r)) + cost(i))
              // Node i is chosen, then we can pick some elements from 
              // children node, or from untouched sibling nodes + descendants
在哪里

  • x
    是大于
    i
    的最小索引,节点
    x
    i
    是同级节点
  • y
    是最小的索引,其中节点
    y
    是节点i的子节点
  • 如果未找到索引,则未找到将分配给
    x
    y

结果将是
f(0,K)

只需贪婪地从根节点和已拾取的节点中选择权重最小的节点。我贪婪的尝试是错误的,我重新发布了dave的原始注释,以便其他人可以看到:
Greedy不适用于我制作的示例数据:例如,假设有4个标记为1,2,3,4的节点。节点1是根节点。这些是此格式的边(开始、结束、距离):(1、2、2)、(1、3、3)、(3、4、1)。此算法将选择要连接的节点2和节点3,但正确的答案是选择3和4
no,我的目的是通过我的uni为ACM做准备。我仍在努力掌握这些竞赛问题的诀窍。而且我甚至没有想到DP里面有DP。谢谢