在给定一些约束的情况下,设计一种算法来最小化所有顶点的总成本。

时间:2014-12-08 19:19:29

标签: algorithm graph tree binary-tree

我无法理解这个问题,需要帮助只是一个方向会很棒..

让有一个有根的有向树T,不一定是二进制。

每个顶点都有一个权重,因此顶点的权重大于顶点父亲的权重。

每个顶点都可以指定为常规顶点或枢轴顶点。

枢轴顶点的成本与其重量相同。

常规顶点获得折扣:它们的成本是它们的重量减去作为枢轴顶点的最近祖先的重量。

因此,选择顶点作为枢轴顶点可能会增加其成本,但会降低其某些后代的成本。

如果常规顶点没有祖先是一个枢轴顶点,那么它的成本就是它的重量本身。枢轴顶点的数量没有限制。

我必须设计一种有效的算法来将每个顶点指定为常规顶点或枢轴顶点,以便最小化所有顶点的总成本。

2 个答案:

答案 0 :(得分:4)

这是另一个动态程序。我将假设根必须是一个枢轴节点。对于每个节点u,让W[u]u的权重。对于节点uvu = vuv的正确后代,让C[u, v]成为子树的最佳成本根据{{​​1}}的最左侧枢轴祖先为u,根据u。然后我们有一个复发

v

没有单独的基本情况,因为总和可能为空。运行时间为O(后代 - 祖先对的数量),即O(n ^ 2)。

答案 1 :(得分:3)

您可以使用动态编程,其中DP [i,k]表示以顶点为根的子树的最小成本,假设查看子树我们可以看到k个常规顶点(概念是枢轴节点是不透明的,而常规的节点是透明的)。

在计算成本时,我们使用除了这些k个常规顶点之外的常规逻辑。对于k个顶点,我们分配顶点的成本,但尚未应用折扣。

关键是当我们在权重x的子树上方指定一个枢轴节点时,我们可以通过应用k倍折扣x来立即计算子树的最终成本。

目前尚不清楚这是否足以满足您的需求,因为您尚未说明图表的大小。

动态编程表中将有O(n ^ 2)个条目(其中n是顶点数)。 我希望递归关系采用O(n)来计算,所以这将给出O(n ^ 3)的整体复杂度。