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