题目描述
题解
这什么dp啊?本质就是个贪心嘛。。。
最大值最小,很容易想到二分。关键是判定怎么判。
我们可以采取贪心的策略,也就是说,如果一条链长度大于mid的话就讲中间的一条边砍去。由于dfs的时候由下到上都保证了最长链长度小于或等于mid,那么每次一定不会砍掉多于一条边。
当dfs到点x的时候,我们已经算出来了点x的儿子到它的子树里的最长链f[son[x]],将这所有的链从大到小排个序,然后判断i和i+1,如果大于mid的话就砍掉一条边(我们可以认为砍掉的就是x连向它儿子的那条边)。然后都砍完了之后新算出来的最大值就可以作为f[x]。
这个贪心的正确性直接证是不大好证明的,不过试一试就会知道无论链是什么情况都是合适的。
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace