检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
#题面
#题目描述
Bessie 正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会。当然,她会选择最方便的地点来举办这次集会。
每个奶牛居住在 个农场中的一个,这些农场由 条道路连接,并且从任意一个农场都能够到达另外一个农场。道路 连接农场 和 ,长度为 。集会可以在 个农场中的任意一个举行。另外,每个牛棚中居住着 只奶牛。
在选择集会的地点的时候,Bessie 希望最大化方便的程度(也就是最小化不方便程度)。比如选择第 个农场作为集会地点,它的不方便程度是其它牛棚中每只奶牛去参加集会所走的路程之和(比如,农场 到达农场 的距离是 ,那么总路程就是 )。帮助 Bessie 找出最方便的地点来举行大集会。
#输入格式
第一行一个整数 。
第二到 行:第 行有一个整数 。
第 行到 行:第 行为 个整数: 和 。
#输出格式
一行一个整数,表示最小的不方便值。
#输入输出样例
样例输入 #1
5
1
1
0
0
2
1 3 1
2 3 2
3 4 3
4 5 3
样例输出 #1
15
#提示
对于 的数据,,,。
#思路
为一棵无根树指定根节点使得所有点的深度之和最小。
可以发现选定农场沿某条边 移动时, 所在子树中的所有奶牛对答案的贡献都会增加 , 所在子树中的所有奶牛对答案的贡献都会减少 ,答案的增加量为 。显然当选定农场位于树的重心时,答案为最小值(准确来说,应该将树的重心的定义中「最大子树的节点数最少」改为「最大的点权块最小」才成立)。
于是求树的重心的代码变成了这样(注意高亮行):
14 |
|
最后求深度时不要忘了加上边权:
void dfs2(int, int)
中:C++34 |
|
#代码
1 |
|