将加权树分区为等加权子树

时间:2014-11-19 20:20:08

标签: algorithm tree graph-theory graph-algorithm partitioning

输入:

  • 带有n个节点的带根树;
  • 每个节点p具有正整数权重w(p);
  • 一个节点可以有两个以上的孩子。

问题:

  • 将树划分为k子树/分区(显然通过删除k-1边缘);
  • 子树权重W(p)是以节点p为根的子树中所有节点的权重;
  • 所有子树应尽可能均匀加权 - min(W(p))max(W(p))之间的差异应尽可能小。

我还没有为此找到合适的算法。我应该从哪里开始?提示,说明和伪代码赞赏。

1 个答案:

答案 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候选节点。您需要某种终止条件,在这种情况下,您不需要与每个叶节点进行交互。例如。将最大的候选节点细分为任何东西都没有意义。