#550. 城市建设

城市建设

题目描述

一个国家有 nn 座城市和 n1n-1 条道路。第 ii 座城市有商业价值 cic_i;第 jj 条道路连接城市 uj,vju_j,v_j,有建设代价 wjw_j。保证 nn 座城市被连成了一棵树。

你可以进行 kk 次城市建设,每次可以选择一座城市(可以之前被建设过)和两条和这座城市相邻的,没有被建设的道路建设。

kk 次城市结束后,如果城市 ii至少建设过一次,则会产生 cic_i 的收益;如果道路 jj 被建设过,则会产生 wjw_j 的代价。求最大收益(可能为负)。

保证有解,即至少存在一种进行 kk 次城市建设的方案。

输入格式

第一行三个整数 n,k,tn,k,t。如果 t=0t=0 则不需要构造方案,否则需要构造方案。

第二行 nn 个整数 c1,c2,,cnc_1,c_2,\cdots,c_n

接下来 n1n-1 行,其中第 jj 行三个整数 uj,vj,wju_j,v_j,w_j

输出格式

第一行输出一个整数表示最大收益。

如果 t=1t=1,则还需要输出 kk 行,第 ii 行三个整数 ui,v1i,v2iu_i,v1_i,v2_i,表示选择了城市 uiu_i 和道路 (ui,v1i),(ui,v2i)(u_i,v1_i),(u_i,v2_i)

样例

样例输入 #1

6 2 1
1 2 3 4 5 6
1 2 1
2 3 5
2 4 3
1 5 2
5 6 4

样例输出 #1

-3
5 6 1
2 4 1

image-20240725202721463

样例输入 #2

8 3 0
4 5 1 2 3 1 3 5
2 1 15
7 1 5
4 8 1
8 5 2
7 8 1
6 7 5
3 7 7

样例输出 #2

-13

image-20240725202820262

如何检验你的输出

下发文件中有 check.cpptestlib.h。将两个文件放在同一目录下后使用命令:

g++ -o check check.cpp -O2 -std=c++14

即可编译 check.cpp 得到可执行文件 check

如果你在 Linux 系统下,使用命令:

./check <input-file> <output-file> <answer-file>

如果你在 Windows 系统下,使用命令:

check <input-file> <output-file> <answer-file>

即可检验你的输出正确性。

其中 <input-file> <output-file> <answer-file> 分别对应输入文件,输出文件和答案文件。

数据范围与约定

对于所有数据,有:

  • 3n2×1053 \le n \le 2 \times 10^5
  • 1k(n1)/21 \le k \le \lfloor (n-1)/2 \rfloor
  • 0t10 \le t \le 1
  • 1ci1081 \le c_i \le 10^8
  • 1uj,vjn,1wi1081 \le u_j,v_j \le n,1 \le w_i \le 10^8
子任务 nn tt 特殊性质 分值
11 200\le 200 =0=0 1010
22 2×103\le 2 \times 10^3 1212
33 1 \le 1
44 2×105\le 2 \times 10^5 =0=0 uj=j,vj=j+1u_j=j,v_j=j+1 1414
55 1\le 1
66 =0=0 1919
77 1\le 1