bzoj#P2133. 切割

切割

题目描述

有一棵 nn 个节点的无根树,节点编号为 1n1\dots n。每个节点有一个非负权值。现在需要把这棵树分成若干个联通块(不能有剩下的点),每个联通块的节点个数在 k1k_1k2k_2 之间,每个联通块的得分就是该联通块中所有节点权值的平均值。总得分就是指对这个树切割后所有联通块的得分的和。你需要求出一种分割的方案使得总得分尽量小。

输入格式

第一行三个整数 n,k1,k2n,k_1,k_2

第二行 nn 个整数,第 ii 个数表示编号为 ii 的节点的权值,每两个相邻整数之间用一个空格隔开;

接下来 n1n-1 行,每行两个整数 x,yx,y ,表示编号为 xx的节点和编号为 yy 的节点之间有一条边。

输出格式

如果存在一个切割方案,那么输出一个实数(四舍五入保留二位小数),表示所有分割方案中最小的总得分。如果不存在切割方案,那么输出所有节点权值和的两倍。如果对于某个测试点你的输出和标准输出完全一样,那么将得到该测试点全部的分,否则该测试点不得分(我的 sp 貌似有问题,大家可以使用 double 类型存储数据,输出结果的整数部分保证不超过 99 位(十进制),使用 double 类型可以保证小数部分至少是 66 位,因而精度应该不存在问题)。

3 1 1
1 1 1
1 2
2 3
3.00

数据规模与约定

对于 100%100\% 的数据,1k1k2n1\le k_1\le k_2\le n2n502\le n\le 50,每个点的权值均不超过 10910^9