很明显的树形dp问题,定义代表了当前节点选或者不选。

  • 如果不选,那么:
  • 如果选,在满足权值和条件的情况下,。其中d为选了其中一个孩子后的最大取值,不明白的话可以见代码。
import sys
from bisect import bisect_left
from math import inf, isqrt

# 输入加速
input = sys.stdin.readline
"""
    树形dp,当前点选或者不选
    f[i][0/1]
"""

if __name__ == '__main__':
    n = int(input())
    weight = [0] + list(map(int, input().split()))
    g = [[] for _ in range(n + 1)]
    for i in range(n - 1):
        u,v = map(int, input().split())
        g[u].append(v)
        g[v].append(u)
    f = [[0] * 2 for _ in range(n + 1)]
    def dfs(cur: int,fa: int):
        d = [-inf]
        for nxt in g[cur]:
            if nxt == fa: continue
            dfs(nxt, cur)
            w = weight[cur] * weight[nxt]
            if w == isqrt(w) ** 2:
                d.append(2 + f[nxt][0] - max(f[nxt][0], f[nxt][1]))
            f[cur][0] += max(f[nxt][0], f[nxt][1])
        f[cur][1] = f[cur][0] + max(d)
    dfs(1,0)
    print(max(f[1][0], f[1][1]))