D 题解 | #小美的树上染色

小美的排列询问

https://ac.nowcoder.com/acm/contest/63585/A

from functools import lru_cache
from math import sqrt

@lru_cache(None)
def dfs(u, parent, b):
    """
    param:
        b: 当前节点是否已经染色
    """
    res = 0
    t = []  # (权值,染色的贡献,不染色的贡献)
    for v in g[u]:
        if v != parent:
            t.append((ws[v], dfs(v, u, True), dfs(v, u, False)))
    sumy = sum(y for w, x, y in t)
    if b:
        # 当前已经染色,计算所有孩子节点没染色的贡献之和
        res = sumy
    else:
        # 没有染色的话,要不 不与孩子节点染色
        # 要不选取一个与之染色
        res = sumy
        wu = ws[u]
        for w, x, y in t:
            if int(sqrt(wu*w))**2 == w*wu:
                res = max(res, 2 + sumy-y+x)
    return res


n = int(input())
ws = list(map(int, input().split()))
g = [[] for _ in range(n)]
for _ in range(n-1):
    u, v = map(int, input().split())
    u, v = u-1, v-1
    g[u].append(v)
    g[v].append(u)

print(dfs(0, -1, False))
全部评论

相关推荐

在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
HNU_fsq:建议直接出国,这简历太6了。自愧不如
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务