#P51486. 「APIO 2021」封闭道路

「APIO 2021」封闭道路

题面描述

在泗水市,有 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 对每个可能的非负整数 k (0kN1)k\ (0\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 的数组。对每个 k (0kN1)k\ (0 \le k\le N - 1)kk 号元素是使得每个路口与至多 kk 条未封闭道路直接连接的最低总成本。
  • 该函数将被调用恰好一次。

样例 1

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

考虑如下调用:

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

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

roads-1.png

为了得到最低的总成本:

  • 如果 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]

4
0 1 5
2 0 10
0 3 5
20 10 5 0

考虑如下调用:

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

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

roads-2.png

为了得到最低的总成本:

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

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

约束

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

子任务

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

示例测试程序

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

  • 11 行: NN
  • 2+i2 + i (0iN20 \le i \le N - 2) 行: U[i]  V[i]  W[i]U[i] \; V[i] \; W[i]

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