以边为对象的树形DP 学习总结

一、核心思想

以边为研究对象的树形DP,关注点是树的边,但状态定义与转移仍围绕子树展开。
核心是将与边相关的问题,转化为对节点状态的决策问题,通过动态规划在树上进行状态转移求解。

二、经典树上问题模型

1. 最小点覆盖(战略游戏问题)

  • 问题描述:给定无根树,士兵驻扎在点上可看守相邻边,求守住所有边的最少士兵数。
  • 问题转化:每条边 ( u , v ) (u,v) (u,v) 需满足 u u u v v v 至少有一个点部署士兵。
  • 状态定义
    • d p [ u ] [ 0 ] dp[u][0] dp[u][0]:以 u u u为根的子树, u u u 不放置士兵时的最小士兵数。
    • d p [ u ] [ 1 ] dp[u][1] dp[u][1]:以 u u u 为根的子树, u u u 放置士兵时的最小士兵数。
  • 状态转移
    • d p [ u ] [ 0 ] = ∑ d p [ v ] [ 1 ] dp[u][0] = ∑ dp[v][1] dp[u][0]=dp[v][1] u u u 不放置士兵,子节点 v v v 必须放置。
    • d p [ u ] [ 1 ] = 1 + ∑ m i n ( d p [ v ] [ 0 ] , d p [ v ] [ 1 ] ) dp[u][1] = 1 + ∑ min(dp[v][0], dp[v][1]) dp[u][1]=1+min(dp[v][0],dp[v][1]) u u u 放置士兵,子节点 v v v 可放或不放,取最小值。

2. 最大匹配(树的匹配问题)

  • 问题描述:从树中选出最多的边,使得任意两条边无公共点。
  • 状态定义
    • d p [ u ] [ 0 ] dp[u][0] dp[u][0]:以 u u u 为根的子树, u u u 不与子节点匹配时的最大匹配数。
    • d p [ u ] [ 1 ] dp[u][1] dp[u][1]:以 u u u 为根的子树, u u u 与其中一个子节点匹配时的最大匹配数。
  • 状态转移
    • d p [ u ] [ 0 ] = ∑ m a x ( d p [ v ] [ 0 ] , d p [ v ] [ 1 ] ) dp[u][0] = ∑ max(dp[v][0], dp[v][1]) dp[u][0]=max(dp[v][0],dp[v][1]) v v v u u u 的子节点): u u u 不匹配,子节点取两种状态最大值。
    • d p [ u ] [ 1 ] = m a x d p [ v i ] [ 0 ] + 1 + ∑ m a x ( d p [ v j ] [ 0 ] , d p [ v j ] [ 1 ] ) ( j ≠ i ) dp[u][1] = max{ dp[vi][0] + 1 + ∑ max(dp[vj][0], dp[vj][1]) }(j \ne i) dp[u][1]=maxdp[vi][0]+1+max(dp[vj][0],dp[vj][1])j=i u u u 与某个子节点 v i vi vi 匹配。
  • 优化技巧
    • 利用 d p [ u ] [ 0 ] dp[u][0] dp[u][0] 简化计算: d p [ u ] [ 1 ] = m a x ( d p [ u ] [ 0 ] − m a x ( d p [ v i ] [ 0 ] , d p [ v i ] [ 1 ] ) + d p [ v i ] [ 0 ] + 1 ) dp[u][1] = max ( dp[u][0] - max(dp[vi][0], dp[vi][1]) + dp[vi][0] + 1 ) dp[u][1]=max(dp[u][0]max(dp[vi][0],dp[vi][1])+dp[vi][0]+1)

3. 树的直径

  • 定义:树上任意两节点之间的最长简单路径。
  • 求解方法 1 1 1:两次DFS/BFS法(贪心)
    1. 任选一点出发,通过DFS/BFS找到距离该点最远的点 s s s
    2. s s s 出发再次DFS/BFS,找到距离 s s s 最远的点 t t t s − t s-t st 即为直径。
    3. 适用条件:边权非负。
  • 求解方法 2 2 2:树形DP法
    • 状态定义
      • d 1 [ u ] d1[u] d1[u]:以 u u u 为根的子树中,从 u u u 出发向下的最长路径长度。
      • d 2 [ u ] d2[u] d2[u]:以 u u u 为根的子树中,从 u u u 出发向下的次长路径长度(与最长路径无重合边)。
    • 状态转移:遍历 u u u 的子节点 v v v,计算 l e n = d 1 [ v ] + w ( u , v ) len = d1[v] + w(u,v) len=d1[v]+w(u,v)
      • l e n > d 1 [ u ] len > d1[u] len>d1[u],则 d 2 [ u ] = d 1 [ u ] , d 1 [ u ] = l e n d2[u] = d1[u],d1[u] = len d2[u]=d1[u]d1[u]=len
      • l e n > d 2 [ u ] len > d2[u] len>d2[u] l e n ≤ d 1 [ u ] len \le d1[u] lend1[u],则 d 2 [ u ] = l e n d2[u] = len d2[u]=len
    • 全局直径:所有节点的 d 1 [ u ] + d 2 [ u ] d1[u]+d2[u] d1[u]+d2[u] 中的最大值。

三、重要图论定理与关系

1. Kőnig定理:二分图的最小点覆盖数 = 二分图的最大匹配数。在树上,最小点覆盖数等于最大匹配数。

2. Gallai恒等式:对于任意无向图,最小点覆盖数 + 最大独立集数 = 总顶点数 |V|。

  • 点覆盖的补集是独立集,独立集的补集是点覆盖。

3. 四大经典树上问题对比

概念 选择对象 核心约束 优化目标 直观比喻
最大独立集 选出的点两两不相邻 最小化 建基站覆盖所有城市
最小点覆盖 每条边至少有一个端点被选 最小化 街道巡逻监控所有街道
最大匹配 选出的边两两无公共点 最大化 相亲大会一人只结一次婚

四、典型例题与应用

  1. CF911F Tree Destruction:给定无权树,通过 n − 1 n-1 n1 次选两个叶子、累加路径长度并删除一个叶子的操作,求最大答案并构造操作序列。核心思路是利用树的直径,优先处理非直径节点,再处理直径节点。

  2. CF161D Distance in Tree:统计树上距离恰好为$ k$ 的简单路径数量。状态定义 d p [ u ] [ j ] dp[u][j] dp[u][j] 表示以 u u u 为根的子树中到 u u u 距离为 j j j 的节点数,采用“先统计跨子树路径、再合并子树状态”的策略求解。

  3. P3304 [SDOI2013] 直径:求树的直径长度,以及所有直径都经过的边的数量。利用直径性质:任意直径必相交,中点唯一。

五、总结

以边为对象的树形DP,可以将边的约束转化为节点的状态决策。掌握最小点覆盖、最大匹配、树的直径等经典模型的状态设计与转移,理解相关图论定理,再结合一些技巧,就能解决这类DP问题。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐