#P7600. [APIO2021] 封闭道路

[APIO2021] 封闭道路

题目背景

本题只支持 C++ 提交,提交时不需要包含 roads.h 头文件,只需要将附件中的 roads.h 中的内容粘贴到代码的开头即可。

题目描述

在泗水市,有 NN 个路口(编号从 00N1N-1)。这些路口由 N1N-1 条双向道路连接(编号从 00N2N-2),因此通过这些道路,任意一对路口之间都有一条唯一的路径。ii 号道路(0iN20 \le i \le N-2)连接着 U[i]U[i] 号和 V[i]V[i] 号路口。

为了提高环保意识,泗水市长 Pak Dengklek 计划举办无车日。为了鼓励该活动,Pak Dengklek 将组织封路。Pak Dengklek 将首先选择一个非负整数 kk,然后封闭一些道路,以使每个路口只能直接连接至多 kk 条未封闭的道路。封闭 ii 号道路的成本为 W[i]W[i]

请你帮助 Pak Dengklek 对每个可能的非负整数 kk0kN10 \le k \le N-1)计算封闭道路的最低总成本。

你需要实现下列函数:

int64[] minimum_closure_costs(int N, int[] U, int[] V, int[] W)

  • NN:泗水市的路口数量。

  • UUVV:大小为 N1N-1 的数组,其中 U[i]U[i] 号路口和 V[i]V[i] 路口通过 ii 号道路直接连接。

  • WW:大小为 N1N-1 的数组,其中封闭 ii 号道路的成本为 W[i]W[i]

  • 该函数需要返回一个大小为 NN 的数组。对每个 kk0kN10 \le k \le N-1),kk 号元素是使得每个路口与至多 kk 条未封闭道路直接连接的最低总成本。

该函数将被调用恰好一次。

输入格式

示例测试程序按如下格式读取输入数据:

  • 11 行:NN
  • 2+i2+i0iN20 \le i \le N-2)行:U[i]U[i] V[i]V[i] W[i]W[i]

输出格式

示例测试程序输出仅一行,包含一个数组,表示 minimum_closure_costs 的返回值。

5
0 1 1
0 2 4
0 3 3
2 4 2

10 5 1 0 0

4
0 1 5
2 0 10
0 3 5

20 10 5 0

提示

例子

例子 11

考虑如下调用:

minimum_closure_costs(5, [0, 0, 0, 2], [1, 2, 3, 4], [1, 4, 3, 2])

这个例子中共有 55 个路口和 44 条道路,分别连接着路口 (0,1),(0,2),(0,3)(0,1),(0,2),(0,3)(2,4)(2,4),封闭它们的成本依次为 1,4,31,4,322

为了得到最低的总成本:

  • 如果 Pak_Dengklek 选择 k=0k=0,那么所有道路都需要封闭,总成本为 1+4+3+2=101+4+3+2=10
  • 如果 Pak_Dengklek 选择 k=1k=1,那么需要封闭 00 号道路和 11 号道路,总成本为 1+4=51+4=5
  • 如果 Pak_Dengklek 选择 k=2k=2,那么需要封闭 00 号道路,总成本为 11
  • 如果 Pak_Dengklek 选择 k=3k=3k=4k=4,那么没有道路需要封闭。

因此,minimum_closure_costs 应该返回数组 [10,5,1,0,0][10,5,1,0,0]

例子 22

考虑如下调用:

minimum_closure_costs(4, [0, 2, 0], [1, 0, 3], [5, 10, 5])

这个例子中共有 44 个路口和 33 条道路,分别连接着路口 (0,1),(2,0)(0,1),(2,0)(0,3)(0,3),封闭它们的成本依次为 5,105,1055

为了得到最低的总成本:

  • 如果 PakDengklek 选择 k=0k=0,那么所有道路都需要封闭,总成本为 5+10+5=205+10+5=20
  • 如果 PakDengklek 选择 k=1k=1,那么需要封闭 00 号道路和 22 号道路,总成本为 5+5=105+5=10
  • 如果 PakDengklek 选择 k=2k=2,那么需要封闭 00 号道路或 22 号道路,总成本为 55
  • 如果 PakDengklek 选择 k=3k=3,那么没有道路需要封闭。

因此,minimum_closure_costs 应该返回数组 [20,10,5,0][20,10,5,0]

约束

  • 2N1052 \le N \le 10^5
  • 0U[i],V[i]N10 \le U[i],V[i] \le N-1 (0iN2)(0 \le i \le N-2)
  • 任意一对路口可以通过道路互相到达。
  • 1W[i]1091 \le W[i] \le 10^9 (0iN2)(0 \le i \le N-2)

子任务

  1. (5 分) U[i]=0U[i]=0 (0iN2)(0 \le i \le N-2)
  2. (7 分) U[i]=iU[i]=iV[i]=i+1V[i]=i+1 (0iN2)(0 \le i \le N-2)
  3. (14 分) N200N \le 200
  4. (10 分) N2000N \le 2000
  5. (17 分) W[i]=1W[i]=1 (0iN2)(0 \le i \le N-2)
  6. (25 分) W[i]10W[i] \le 10 (0iN2)(0 \le i \le N-2)
  7. (22 分) 无附加限制