先暴力贪心。
设 fu,0/1 分别表示是否删除 u 和父亲之间的边,子树内的最小代价。
我们要满足的就是 u 被删除的边数 k 满足 duu−k≤x。
这下每个 v,不是选 w+fv,1 就要选 fv,0,也就是二选一,且尽量删边。
对于所有儿子 v,如果 fv,1+wu,v≤fv,0,那么我们选它是不劣的。
如果我们选了这些后,度数还是无法满足条件。
将未选边按照 fv,1+wu,v−fv,0 排序,从最小开始选就行了。
简化一点,选择前 duu−x 小的 fv,0+wu,v,其他选择 min(fv,0+wu,v,fv,1)。
fu,1 同理。
发现当 duu≤x 时,就是选择了子树内的最优方案,且无需满足度数限制,且 fu,0 和 fu,1 对父亲的影响只有 wu,v。
这启发我们,如果我们的可以做到每次只 dp
有用的点,那么复杂度是 O(∑x∑i[dui>x])=O(∑dui)=O(n)。
删掉无用点后,将我们要用到的边权记到有用的点上。
为什么,无用点和无用点之间的边是肯定满足的,那么无用点只会对有用点产生贡献,所以每次相当于将无用点看成联通块无用的叶子。
考虑有用点和无用点之间的决策,能产生影响的就只有 wu,v。