给定一个二叉树,其中有n个节点,每个节点的权重为wi(i表示第i个节点的权重),我们必须为树的每个节点着色。节点着色的成本等于节点的重量乘以节点着色的时间。时间从1开始,并随着您继续为节点着色而增加1。在强制着色时,父母必须在孩子之前着色。计算着色整棵树的最低成本?
答案 0 :(得分:0)
在研究文献中,这个问题是在单台机器上优先安排作业,以最大程度地减少总加权完成时间。由于劳勒,有一个O(n log n)算法用于串并联优先级。在特殊情况下,让我总结一下。
如果不要求将父母安排在孩子之前,则我们希望按不增加体重的顺序上色。 Lawler的过程是自下而上的,将节点组合成我称之为复合节点的过程。每个节点x的输出是一组复合节点,其中(1)恰好包含x的每个后代(2)可以按权重的非降序进行着色(其中,复合节点的权重是其平均权重)组成节点)而不会违反父子排序约束。
在后顺序的每个节点x上,首先合并x的子级中的集合。尽管合并集中存在一个复合节点,其大小至少与x一样重,但弹出该节点并用x和该节点组成的复合节点替换x。为了提高效率,请将集合表示为可合并的优先级队列(例如,配对堆)。
最后,对复合节点进行排序并将它们展平到一个列表中。
答案 1 :(得分:0)
您可以做的是可以逐级遍历树。对整个级别进行排序,然后对每个节点进行着色,以使其总和最小。对每个级别重复此操作。
举例说明,如果您有以下树:
4
/ \
3 7
/ \
1 9
/
2
4
。time
:4*1
。费用= 4。3 7
。time
:7*2 + 3*3 = 23
。费用= 4 + 23 = 27。1 9
time
:9*4+1*5 = 41
。费用= 27 + 41 = 68。2
time
:2*6 = 12
。费用= 68 + 12 = 80。如何以级别顺序遍历二叉树。请参考:https://www.geeksforgeeks.org/level-order-tree-traversal/