#P14571. [Bulgarian 2024]tree

    ID: 13788 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 7 上传者: 标签>CF2300树形DP贪心二分图论队列

[Bulgarian 2024]tree

题目描述

扬(Yan)非常喜欢信息学,尤其喜欢图论。因此,他每天在学校里都会画一棵树,并且尽量在绘制过程中不把笔从纸上抬起来

每天,他都会想出一棵有 NN 个点的树,并从树的根开始绘制。每条边连接顶点 aia_ibib_i,长度为 lil_i。从根开始后,他沿着树边移动,在整个过程中不抬笔,并希望经过所有顶点和所有边至少一次

后来,扬觉得一个人画太无聊了,于是决定让朋友们帮忙。规则如下:

  • 当树上的某个顶点已经被画到之后,扬可以叫来一个朋友;
  • 这个朋友从该顶点开始继续画;
  • 每个人在自己的绘制过程中也都不能抬笔。

扬最好的朋友阿西娜(Athena)会给每次绘制打分。评分公式为:

L+k×PL + k \times P

其中:

  • LL 表示扬和所有朋友在纸上画过的总长度
  • kk 表示扬叫来的朋友总数;
  • PP 表示“呼叫一个朋友”的费用,由扬在开始作画前选定。

注意:如果某条边被重复经过多次,那么它的长度会被重复计入 LL 中。

扬希望让阿西娜给出的分数尽可能小。对于每一天,他都会考虑若干不同的费用 PiP_i,并想知道:当“呼叫朋友”的费用为 PiP_i 时,最小可能得分是多少。

输入格式

第一行一个整数 TT,表示测试组数。

对于每组测试:

  • 第一行一个整数 NN,表示树的节点数。
  • 接下来 N1N-1 行,每行三个整数 ai,bi,lia_i, b_i, l_i,表示一条边的两个端点及其长度。
  • 接下来一行一个整数 QQ,表示需要回答的不同费用个数。
  • 接下来 QQ 行,每行一个整数 PiP_i,表示一次“呼叫朋友”的费用。

输出格式

对于每组测试,输出 QQ 行,每行一个整数,表示当费用为对应的 PiP_i 时,扬能够得到的最小分数。

数据范围

  • 1T51 \le T \le 5
  • 1N1051 \le N \le 10^5
  • 1Q1051 \le Q \le 10^5
  • 1li1091 \le l_i \le 10^9
  • 1Pi1091 \le P_i \le 10^9
  • 所有测试数据中,QQ 的总和不超过 10510^5

子任务

子任务 分值 NN Q,QQ,\sum Q 额外限制
1 5 5\le 5 =1=1
2 10 10\le 10
3 15 103\le 10^3
4 5 105\le 10^5 li=1, Pi=109l_i=1,\ P_i=10^9
5 20 50\le 50
6 5 105\le 10^5 ai=1a_i=1
7 20 104\le 10^4
8 105\le 10^5

只有通过某个子任务中的所有测试点,才能获得该子任务的全部分数。

样例输入

1
7
1 2 10
1 3 10
2 4 5
2 5 10
3 6 10
3 7 20
2
10
100

样例输出

90
100

样例说明

样例中只有 11 棵树,需要回答两种不同的费用 PP

情况 1:P1=10P_1=10

最优方案是再叫来 2 个朋友帮忙:

  • 扬先走路径:124251 \to 2 \to 4 \to 2 \to 5
  • 然后他在顶点 11 叫来朋友 1;
  • 朋友 1 走路径:1371 \to 3 \to 7
  • 接着他们在顶点 33 再叫来朋友 2;
  • 朋友 2 走路径:363 \to 6

于是总绘制长度为:

L=30+30+10L = 30 + 30 + 10

朋友数为:

k=2k = 2

总得分为:

L+k×P=(30+30+10)+2×10=90L + k \times P = (30+30+10) + 2 \times 10 = 90

注意,即使某条边之前已经被画过,只要再次经过,它的长度仍然会再次计入答案。

情况 2:P2=100P_2=100

由于叫朋友的代价太高,最优方案是由扬一个人完成整棵树的绘制。

可以证明,此时最小得分为:

100100