原题链接
题意
给定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)\)。代码见此