1. 解题思路
这一题思路上就是一个树的遍历。
我们首先构造出这个树,然后根据其所有子节点当中最大的权重构造出各个节点的累积权重。然后,我们考察将其平衡的情况下需要多少次操作,显然,由于操作只能增不能减,因此,我们显然就是考察每一个节点的所有子树上的累计权重,将其他的所有权重都变为最大的那个子树,因此,最大的子树保持不动,然后其他的子树都优先变动父节点将其对齐,然后迭代考察其子树即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def minIncrease(self, n: int, edges: List[List[int]], cost: List[int]) -> int:
graph = defaultdict(list)
for u, v in edges:
graph[u].append(v)
graph[v].append(u)
tree = defaultdict(list)
def dfs1(u, p):
nonlocal tree
for v in graph[u]:
if v == p:
continue
tree[u].append(v)
dfs1(v, u)
return
dfs1(0, -1)
weights = deepcopy(cost)
def dfs2(u):
nonlocal weights
w = 0
for v in tree[u]:
w = max(w, dfs2(v))
weights[u] += w
return weights[u]
dfs2(0)
def dfs3(u):
if len(tree[u]) == 0:
return 0
w = max(weights[v] for v in tree[u])
ans = 0
for v in tree[u]:
ans += dfs3(v) if weights[v] == w else 1 + dfs3(v)
return ans
return dfs3(0)
提交代码评测得到:耗时791ms,占用内存88.46MB。