Codeforces 1029E

原题链接

题意

给定1棵树。求最少添加多少条边,使得各点到1号点的距离小于等于2。

\(1 \leq n \leq 2 \times 10^5\)

题解

(由于目标是最小化到1号点距离,下文默认添加的边均为\((1,u)\)

首先从问题的终态出发,倒推问题的实质。

终态中,各点的连接情况只有2种:直接与1相连 或 某相邻点与1相连。

在有根树上,情况1代表自己,情况2代表父亲与儿子。对任意点三者中至少1个被选,最小化选点数。


思路1

经典的树形DP

具体地,任意点\(i\)有3种状态:\(1->fa(i)\)\(1->i\)\(1->son(i)\)

因而记\(f(i)(0/1/2)\)为解决以\(i\)为根的子树,且\(i\)的父亲被选/\(i\)被选/\(i\)的至少1个儿子被选的最小化选点数。

转移方程

\(f(i)(0)=\sum{min(f(j)(1),f(j)(2))}\)

\(f(i)(1)=1+\sum{min(f(j)(0),f(j)(1),f(j)(2))}\)

\(f(i)(2)=\sum{min(f(j)(1),f(j)(2))}+min\{f(j)(1)-f(j)(2)\}[f(j)(2)始终大于f(j)(1)]\)

边界

对于叶子结点,\(f(i)(0)=0,f(i)(1)=1,f(i)(2)=\infty\)

所求

对于1号点的各儿子\(head\)\(ans=\sum{min(f(head)(1)-1,f(head)(0),f(head)(2))}\)

时间复杂度\(O(n)\)代码见此


思路2

考虑贪心地制定最优化选点策略。

从选择某点\(i\)产生的影响出发:使\(fa(i)\)\(i\)\(son(i)\)合法。

有1种小聪明思路是自上而下选择既能使父亲合法,又能使儿子合法的点。

这样做优秀的前提是,儿子有众多儿子,且孙子不多;但自上而下决策时并不能知道底层情况并进行调整。

不妨从错误思路中得到启发:上述算法主要在叶子结点处严重失灵,不如从叶子结点处考虑起。

实际上,决策影响决策时,从边界开始决策往往具有更强的确定性,利于求解

对于叶子结点\(i\),令其合法只能选\(i或fa(i)\)。显然选\(fa(i)\)对全局更优。

故直观的思路是反复迭代,每次找到1个叶子结点\(i\),选择\(fa(i)\),删去\(i\)。选择\(fa(i)\)会使得\(fa(i)\)及与\(fa(i)\)相邻的点\(next\)合法化,即当\(next\)成为叶子结点时无需操作;但却不可删去,因为\(next\)仍有作为\(fa\)被选的可能。

叶子结点可以先预处理,再边删边找,单次复杂度\(O(1)\);也不妨利用充分条件,查找所有结点中深度最大者,可用二叉堆维护,单次复杂度\(O(logn)\)

总时间复杂度\(O(n)\)\(O(nlogn)\)。[代码见此](https://github.com/littlewyy/OI/blob/master/cf 1029E greedy)

posted @ 2019-05-23 17:16  littlewyy  阅读(233)  评论(0编辑  收藏  举报