有一棵树有N个节点和N-1个边缘(使它成为一棵树)。每个节点具有权重W(i)。如何选择仍包含原始树根的K个节点的子树?我必须这样做,以便最小化选择这个“子树”的“成本”,其中成本被定义为所有边缘的权重之和。
我想我以前做过这样的问题,看起来像DP /递归。但是,当每个节点限制为2个孩子时,我知道如何处理它。您定义了一个函数成本(n,i),这意味着保持i节点从节点n开始的最低成本。你会在其中一个孩子中从i = 0迭代到n,然后将剩下的孩子交给另一个孩子。但是,由于每个节点可以拥有无限量的子节点,有没有办法解决这个问题?
由于
答案 0 :(得分:2)
对于给定节点,您希望使用其子项的成本(n,i)计算成本(n,i)。从0..K为孩子编号,你有另一个动态程序。在阶段j,你想要仅使用儿童0..j来计算出最好的成本(n,i)。
我一直在考虑使用机器学习来编写类似的东西(只是为了好玩,我想通过拟合两个Weka分类器而不是一个来编写寻找异常的程序)。那有什么像你的目的吗?
答案 1 :(得分:0)
DP解决方案(可能与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)
。