emm随便错
例题
没有上司的舞会
没有上司的舞会
定义 \(f[x][0/1]\) 表示x这个点选或者不选能够带来的最大的快乐值。
因为每一个人的顶头上司肯定不能和他一起选,也就是说,如果当前这个人选了,那么他的直接下属不能选,但是当前这个人不选对快乐值没有影响,也就是。
然后题目就做完了,一个 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 为根的子树之外的有多少个点。
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}\}\)。