输入:
n
个节点的带根树; p
具有正整数权重w(p)
; 问题:
k
子树/分区(显然通过删除k-1
边缘); W(p)
是以节点p
为根的子树中所有节点的权重; min(W(p))
和max(W(p))
之间的差异应尽可能小。 我还没有为此找到合适的算法。我应该从哪里开始?提示,说明和伪代码赞赏。
答案 0 :(得分:0)
假设除了删除边以创建子树之外,您无法修改树。
首先要明白,你不能保证只需删除任意边界内你将拥有子树的边。您可以创建树,当您拆分它们时,无法在目标边界内创建子树。例如:
a(b(c,d,e,f),g)
您无法将其拆分为两个平衡的部分。你能做的最好的就是从a到b删除边缘:
a(g)和b(c,d,e,f)
当k> 0时,这个标准还有点欠定义。 2.分裂10,10,10,1或10,10,6,5有什么好处?
但是你可以想出一种方法,以最平衡的方式分割树木。
实现树,使每个节点都拥有其所有子节点的计数。您可以非常有效地将其添加到任何树。 (例如,当你添加一个节点时,你必须迭代父节点链增加计数。删除一个节点,你迭代从计数中减去)
然后从根向下迭代,以广度优先的方式开始,直到找到一组以最平衡的方式支配子节点的节点。我准备好了没有算法 - 但我认为你很容易找到一个算法。
我认为当你想要分成k个子树时,你会创建一个k树根数组。其中一个节点必须始终是当前树的根,然后迭代查找节点以替换改进分区的k-1候选节点。您需要某种终止条件,在这种情况下,您不需要与每个叶节点进行交互。例如。将最大的候选节点细分为任何东西都没有意义。