树形 DP 从入土到入门


emm随便错

例题

没有上司的舞会

没有上司的舞会
定义 \(f[x][0/1]\) 表示x这个点选或者不选能够带来的最大的快乐值。

因为每一个人的顶头上司肯定不能和他一起选,也就是说,如果当前这个人选了,那么他的直接下属不能选,但是当前这个人不选对快乐值没有影响,也就是。

\[\begin{cases} f_{x, 1} = f_{to, 0} \\ f_{x, 0} = \text{max}(f_{to, 1}, f_{to, 0}) \end{cases} \]

然后题目就做完了,一个 dfs 解决问题

[HAOI2009]毛毛虫


题面自己看吧,简化不动...


传送门
我们令 \(f_x\) 表示以 x 为根的子树内最大的毛毛虫的大小,而且 x 为毛毛虫的头,那么 \(f_x\) 的转移方程就很显然了。
\(cnt_x\) 为 x 的儿子大小。
\(f_x = \max_{to \in son_x} f_{to} + 1 + \max(0, cnt_{to} - 1)\)

[ZJOI2007]时态同步

传送门


给你一棵树,边有边权,然后问你每次可以将一条边的边权加一,
问你至少多少次操作之后,1 这个根节点到叶子节点的路径长度都相同。


可以让所有叶子节点同时发出信号,然后这些信号同时到达根节点。于是我们可以自下而上的进行维护,使得每一节点所有子节点的信号同时到达该节点。

我们从根节点开始搜索,搜索到叶子节点,回溯的时候进行维护,先维护节点的所有子节点到该节点最大边权(边权为叶子节点到同时到达它所需要时间)。然后维护答案,答案为最大边权减去所有到子节点的边权。然后维护父节点的边权,父节点边权为该节点子节点的 最大边权+父节点到该节点的时间。然后就回溯,重复操作,到根节点为止。

换根法

也叫二次扫描法
基本思路是先指定一个根结点,然后第一次dfs求出根节点的权值,然后第二次dfs的时候可以搞一个转移方程由根结点转移过去。

STA-Station

传送门


给定一个 \(n\) 个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和最大。
一个结点的深度之定义为该节点到根的简单路径上边的数量。


\(dp_i\) 为第 i 个结点作为根节点时的深度之和,我们不妨令根结点为 1,然后进行第一次dfs,求出根结点为 1 时的深度之和,然后考虑如何转移。

以样例为例

8
1 4
5 6
4 5
6 7
6 8
2 4
3 4


我们可以知道 \(dp_4\)\(12\) 考虑如何换到5这个结点。

因为换成 5 的时候相当于 5 所在的子树所有的结点的深度都减一,剩下的结点的深度都加一,所以我们令 \(siz_x\) 记录 x 这个结点的子树的大小,\(point\) 为所有子树的大小,然后\(x, to\) 为 x 结点与 x 结点所到的 to( x 为 to 的父亲结点)。
那么 \(point - siz_{to}\) 为除了以 to 为根的子树之外的有多少个点。

\[dp_{to}=dp_x+(point-siz_{to}) - siz_{to} \]

Great Cow Gathering G

传送门


给你一棵树,边有边权,让你求出一个到其他所有点的路径和最小的那个点的路径和。


和上一个题差不多,就是每每条边有边权,也就是说我们可以通过让 siz 数组维护的值改变一下来 AC 这道题。

考虑 siz 数组中存贮每个牛棚的以及他的子树中,一共有多少头牛,剩下的转移就和上边那个题差不多了。

Choosing Capital for Treeland

传送门


给你一棵树,但是树上的边都是单向边,问以 i 点为根的时候,为了能够遍历到每个点,需要修改多少条边的方向。


建图的时候按照双向边建图,正向和反向边分别标记,然后可以很轻松的求出 1 为根时的答案,转移的时候就判断 x 与 to 之间连的边是正向边还是反向边就行了。

树点染色类

Cell Phone Network G

传送门
双倍经验

一开始的时候还以为和黑白染色差不多的那种,但是仔细一想就会发现不对劲。

我们设 \(f_{x,0/1/2}\) 分别为:

  • \(f_{x,0}\) 表示 i 被自己覆盖 的最小花费
  • \(f_{x,1}\) 表示 i 被儿子覆盖 的最小花费
  • \(f_{x,2}\) 表示 i 被父亲覆盖 的最小花费

可以发现,x 自己覆盖的时候,也就是 x 自己建信号塔的时候,他的儿子们建或不建都可,所以转移方程就是 \(f_{x,0} += \min \{ f_{son,0}, f_{son,1},f_{son,2}\}\)

可以发现,自己被儿子覆盖的时候只需要被其中一个儿子覆盖就可以了,所以转移方程就是: \(f_{x.1} = f_{sx.0} + \sum \big(\min (f_{son,0}, f_{son,1})\big )\)

可以发现,他自己如果被父亲覆盖,说明他的儿子一定没有被他自己覆盖,所以状态转移方程就是: \(f_{x,2} += \min \{ f_{son. 0}, f_{son.1}\}\)

树形揹包

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章