#loj5275. 「UOI 2019 Stage 4 Day1」科扎克·武斯与最佳国家

「UOI 2019 Stage 4 Day1」科扎克·武斯与最佳国家

[AdditionalFile5275.zip](file://AdditionalFile5275.zip?type=additional_file)

#5275. 「UOI 2019 Stage 4 Day1」科扎克·武斯与最佳国家

标签: 传统 | 时间限制: 2000 ms | 内存限制: 512 MiB |

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 14 及以上)

请在提交源代码前添加 #include "grader.h"

题目描述

题目译自 Ukrainian Olympiads in Informatics 2019 Stage 4 Day1 T4. Козак Вус і найкраща країна

科扎克·武斯终于找到了他梦想中的国家。这个国家有 nn 座城市,城市之间目前没有任何道路连接。当然,武斯想要改变这种情况,因此他设计了 mm 条不同的双向道路可以修建。每条道路连接两座不同的城市。但问题出现了:每座城市 ii 只能为修建道路提供 cic_i 个硬币,而每条道路 jj 的修建成本为 wjw_j 个硬币。因此,武斯决定只修建部分道路,使得所有城市成为邻居即可。城市被称为邻居,如果可以通过国家内的道路从一座城市到达另一座城市。

在规划工作时,科扎克·武斯意识到一件事:当他修建一条新道路时,城市会合并成邻居群体。为了修建第 jj 条道路,连接的两座城市(或它们的邻居群体)必须总共拥有至少 wjw_j 个硬币(因为需要先支付道路费用,然后才能修建)。修建道路后,城市的预算会合并,道路的成本将从新的公共资金中扣除。

对于每座城市 ii,你知道 cic_i,即城市 ii 能提供的硬币数量。对于每条道路 mm,你知道 vi,ui,wiv_i, u_i, w_i,表示道路 ii 连接城市 viv_iuiu_i,修建成本为 wiw_i 个硬币。请判断是否可以选择一定数量的道路并按特定顺序修建,使得所有城市成为邻居。如果可以,请找出修建道路的序列。

交互方式

为了展示需要修建的道路,使用以下函数:

void add(integer i)
  • 该函数修建编号为 ii (1im)(1 \leq i \leq m) 的道路。

你需要实现以下函数:

boolean solve(integer n, integer m, integer g, array of integers c, array of integers v, array of integers u, array of integers w)
  • nn —— 国家中的城市数量;
  • mm —— 可以修建的道路数量;
  • gg —— 子任务编号;
  • cic_i(数组 cc 的长度为 nn)—— 第 ii 个城市的初始硬币数量;
  • viv_iuiu_i(数组 vvuu 的长度均为 mm)—— 第 ii 条道路连接的顶点编号;
  • wiw_i(数组 ww 的长度为 mm)—— 修建第 ii 条道路所需的硬币数量;
  • 该函数应返回 true\texttt{true}(如果可以正确选择道路序列)或 false\texttt{false}(如果不可以)。

如果函数返回 true\texttt{true},则在返回之前,必须按修建顺序调用 add\texttt{add} 函数,添加所有修建的道路。

输入格式

第一行包含三个整数 n,m,gn, m, g $(1 \leq n \leq 10^{6}, 0 \leq m \leq 10^{6}, 0 \leq g \leq 7)$,分别表示城市数量、道路数量和子任务编号。

第二行包含 nn 个整数 c1,c2,,cnc_1, c_2, \ldots, c_n (1ci106)(1 \leq c_i \leq 10^{6}),表示第 ii 个城市的初始硬币数量。

接下来的 mm 行,每行包含三个整数 vi,ui,wiv_i, u_i, w_i (1vi,uin,1wi106)(1 \leq v_i, u_i \leq n, 1 \leq w_i \leq 10^{6}),分别表示第 ii 条道路连接的城市编号和修建成本。

输出格式

如果函数返回 false\texttt{false},则第一行输出一个数字 1-1

否则,第一行输出一个数字 qq,表示修建的道路数量。接下来的 qq 行,每行输出一个数字 xx,表示修建的道路编号。

样例 1

输入

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

输出

3
4
2
3

在第一个样例中,国家有 44 座城市,科扎克·武斯的计划包含 55 条道路。首先修建编号为 44 的道路:城市 2244 合并为一个群体,总预算中支付了 33 个硬币。该群体的预算剩余 66 个硬币。修建编号为 22 的道路后,预算变为 44 个硬币,因为城市 33 加入带来 22 个硬币,同时支付了 44 个硬币修建道路。修建第 33 条道路后,所有城市成为邻居,预算足够支付 55 个硬币的道路费用。

样例 2

输入

3 3 0
6 2 5
2 3 9
2 1 5
1 3 10

输出

-1

在第二个样例中,无法选择道路及其修建顺序,使得所有城市成为邻居并支付所有道路的费用。

数据范围与提示

详细子任务附加限制及分值如下表所示:

子任务 分值 附加限制
11 33 n10n \leq 10m=n1m = n - 1ci=1c_i = 1wi=1w_i = 1;修建所有 mm 条道路后,所有城市成为邻居
22 88 n,m10n, m \leq 10
33 1212 n,m105n, m \leq 10^{5}ci=1c_i = 1
44 1414 n,m105n, m \leq 10^{5};所有 wiw_i 相同
55 1616 n,m103n, m \leq 10^{3}
66 1919 n,m105n, m \leq 10^{5}
77 1212 n,m5105n, m \leq 5 \cdot 10^{5}
88 1616 无附加限制