1 条题解
-
0
问题定义
给定一棵 个节点的树,要求选择一个节点集合 ,使得对于任意 ,。求 的最大值。
核心观察
在树结构中,距离约束可以转化为:如果选择节点 ,那么 的 邻域内不能选择其他节点。
树形 DP 状态设计
我们定义状态 :
- :以 为根的子树中最多能选择的节点数
- :该子树中距离 最近的已选节点到 的距离(如果没有已选节点,)
但实际上我们不需要显式存储 ,而是维护一个全局答案。
关键算法
我们使用 DFS 后序遍历,为每个节点 计算 :
对于叶子节点 :
- (我们可以选择叶子节点)
对于内部节点 :
- 收集所有子节点的 值,得到列表
- 设 ,
- 如果 :
- 选择节点 ,答案
- 否则如果 :
- 选择节点 ,答案
- 否则:
根节点特殊处理:
处理完根节点后,如果 (即根节点还没有被选择但可以被选择),答案再 。
算法正确性解释
-
当 时:所有子树的最近已选节点都距离 至少 ,选择 不会违反约束。
-
当 时:至少有一个子树的最近已选节点距离 足够远,但更重要的是,这个条件意味着选择 能够获得更好的解。
-
否则:我们保留距离 最远的已选节点信息,为父节点的决策提供便利。
时间复杂度
- 每个节点处理一次:
- 总时间复杂度:
- 空间复杂度:
公式化表示
设 为 的子节点集合,则:
$$rest[u] = \begin{cases} 0 & \text{if } u \text{ is leaf} \\ 0 & \text{if } \min_{v \in C(u)} (rest[v] + 1) \ge d \\ 0 & \text{if } \max_{v \in C(u)} (rest[v] + 1) \ge d \\ \max_{v \in C(u)} (rest[v] + 1) & \text{otherwise} \end{cases} $$在选择节点 时,全局答案增加 。
- 1
信息
- ID
- 4277
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者