import sys
sys.stdin = open('data.txt', 'r')
N, Q = map(int, input().split())
link = {}
for i in range(1, N):
a, b, w = map(int, input().split())
if a not in link:
link[a] = []
if b not in link:
link[b] = []
link[a].append((b, w))
link[b].append((a, w))
'''
在树上选择Q条边,等价于选择连在一起的Q+1个节点,每个节点的权值就是和其父节点连接的边的权值,
根节点的权值为0,问题就变成了一个有依赖的背包问题,首先根节点必选,如果一个节点被选择了,其
父节点必定被选择
dp(i, j) 表示以i为根的子树上选择j个节点,所有节点的权值最大和是多少
在进行决策时候其实就是两个分组进行背包,物品开销是子树选择节点数jj,物品的价值就是dp(子节点id, jj)
'''
# 每个节点的节点数和权重
node_num = [0] * (N+1)
weight = [0] * (N+1)
# 先dfs一把,把node_num, weight填充好
def dfs(root, prev = None):
node_cnt = 1
for child, w in link[root]:
if child == prev:
continue
weight[child] = w
node_cnt += dfs(c
AcWing 树形DP相关问题 1074. 二叉苹果树
最新推荐文章于 2022-09-02 13:27:20 发布