用一段python代码给定一棵树,树根为 1,每个点的点权为 Vi 。 你需要找出若干个点 Pi,使得: 1. 每两个点 Px Py 互不相邻; 2. 每两个点 Px Py 与树根的距离互不相同; 3. 找出的点的点权之和尽可能大。 请输出找到的这些点的点权和的最大值
时间: 2024-05-12 08:16:28 浏览: 90
可以使用动态规划来解决这个问题。设 f(i,0) 表示在以 i 为根的子树中,不选 i 的情况下,其他符合要求的点的最大点权和;f(i,1) 表示在以 i 为根的子树中,选了 i 的情况下,其他符合要求的点的最大点权和。则有如下转移方程:
f(i,0) = sum(max(f(j,0),f(j,1))),其中 j 是 i 的儿子节点
f(i,1) = Vi + sum(f(j,0)),其中 j 是 i 的孙子节点
最终的答案为 max(f(1,0), f(1,1)),即以根节点为起点的结果。
下面是代码实现:
```python
n = int(input())
val = list(map(int, input().split()))
head = [0] * (n + 1)
edge = []
idx = 0
for i in range(1, n):
u, v = map(int, input().split())
edge.append((v, head[u]))
head[u] = idx
idx += 1
edge.append((u, head[v]))
head[v] = idx
idx += 1
f = [[0] * 2 for _ in range(n + 1)]
def dfs(u, fa):
f[u][1] = val[u-1]
for i in range(head[u]):
v = edge[head[u]+i][0]
if v == fa:
continue
dfs(v, u)
f[u][1] += f[v][0]
f[u][0] += max(f[v][0], f[v][1])
return
dfs(1, 0)
print(max(f[1][0], f[1][1]))
```
阅读全文