题目链接
题解 #
首先,以下两点不难想到:
- 我们只会在最大生成树的边上走,这样我们就把图变成了树。
- 对于所有边,最优策略永远是先吃树上一边的所有点然后再吃另一边。
由于宽度小的边会最先不满足条件,因此要优先考虑宽度小的边,但边两侧的连通块的情况还不知道,所以我们要先继续处理两侧的信息再确定吃的方向,而每侧的连通块中最窄的边又会把连通块一分为二……这样一直递归下去直到每个连通块只剩一个点。合并的顺序就是从宽边到窄边,这正好也是求最大生成树的顺序,于是可以在求最大生成树的同时维护答案。对于每个连通块,我们维护进入这个连通块时人的最大宽度mx。假设待合并的两个连通块为u,v,每个块的c值的和为sumu,sumv,u,v之间的边的宽度为w,从u到v要满足mxu+sumu≤mxv和mxu+sumu≤w,变形一下就是mxu=min(mxv,w)−sumu,也就是说如果先吃u再吃 v的话,进入合并之后的连通块时最大的宽度为 min(mxv,w)−sumu,先吃v再吃u的情况类似,取两种情况中宽度更大的情况。
代码 #