题目描述
样例
input:
5 3
1 2 3
1 3 4
2 4 5
3 5 6
1 10
2 10
3 10
output:
8
12
10
10
题目大意
给你一棵树,现在你可以选择其中的一条链,将其边上的权值都减一。并且每条边的权值不能为负数。要求最少要删除多少次(每次只能减一),才能使得整棵树的权值都是0。(只需要输出答案,而不是修改)
并且,在给出答案之后,会有 q q q次修改,将某一条边的权值改成另一个,这时你要再一次输出答案。
分析
首先看到题目有一种树剖的感觉,但是显然,求答案时无法很好地用树剖解决。
所以这题应该是要维护每条边的权值。我们不妨思考一下求答案的过程实际是什么。实际就是找最少的链将树覆盖,然后每条边的重叠次数都有限制。
由于每条链唯一地由两个端点决定,所以,我们不妨考虑一下一棵树被覆盖后的链的端点处在那些节点上。
如图,我已经将覆盖所用的链用不同的颜色标出。可以发现:
- 如果出现图三的情况,即一个点相连的边的权值中 M a x Max Max大于其他边的和,那么其他边可以通过 M a x Max Max通向其他的节点作为终点,而 M a x Max Max减去其他边总和数量的链只有将这个点作为端点了。这样,以这个点为端点个数就是 M a x − O t h e r s Max-Others Max−<