P14345 [JOISC 2019] 两种交通 / Two Transportations
题目背景
**请使用 C++ 20 提交**。不要引入头文件,并在文件头粘贴如下内容:
```cpp
#include
void InitA(int, int, std::vector, std::vector, std::vector);
void ReceiveA(bool);
std::vector Answer();
void SendA(bool);
void InitB(int, int, std::vector, std::vector, std::vector);
void ReceiveB(bool);
void SendB(bool);
```
题目描述
JOI 国有 $N$ 座城市,编号从 $0$ 到 $N-1$。有 $A$ 条铁路线,编号从 $0$ 到 $A-1$。铁路线 $i$($0 \le i \le A-1$)双向连接城市 $U_i$ 与城市 $V_i$,票价为 $C_i$。不同的铁路线连接不同的城市对。另有 $B$ 条公交线路,编号从 $0$ 到 $B-1$。公交线路 $j$($0 \le j \le B-1$)双向连接城市 $S_j$ 与城市 $T_j$,票价为 $D_j$。不同的公交线路连接不同的城市对,但一条铁路线与一条公交线路可能连接相同的城市对。通过铁路和/或公交,可以在任意两座城市之间通行。
Azer 想知道从城市 $0$ 到每个城市的最小总票价。由于 Azer 仅了解铁路线的信息,他与仅了解公交线路信息的 Baijan 合作。
他们通过发送和接收字符 0 或 1 进行通信。发送的字符总数应小于或等于 58000。
编写程序,Azer 的程序接收铁路线信息,Baijan 的程序接收公交线路信息,二者通过通信协作,帮助 Azer 找到从城市 $0$ 到每个城市的最小总票价。
### 实现细节
你需要实现两个文件。
第一个文件的名称为 `Azer.cpp`。它表示 Azer 的行为,应实现以下函数。该文件应包含 `Azer.h`。
- `void InitA(int N, int A, std::vector U, std::vector V, std::vector C)`
此函数在程序开始时恰好执行一次。
- 参数 $N$ 是城市数量 $N$。
- 参数 $A$ 是铁路线数量 $A$。
- 参数 $U$、$V$ 是长度为 $A$ 的数组。$U[i]$ 和 $V[i]$ 是由铁路线 $i$($0 \le i \le A-1$)连接的两座城市。
- 参数 $C$ 是长度为 $A$ 的数组。$C[i]$ 是铁路线 $i$($0 \le i \le A-1$)的票价 $C_i$。
- `void ReceiveA(bool x)`
此函数在 Baijan 每发送一个字符时执行一次。
- 参数 $x$ 表示 Baijan 发送的字符:`true` 代表字符 1,`false` 代表字符 0。
- `std::vector Answer()`
此函数在所有发送的字符均被接收后恰好执行一次。该函数必须返回一个数组 $Z$,其中包含从城市 $0$ 到每个城市的最小总票价。
- 返回值 $Z$ 必须是一个长度为 $N$ 的数组。若其长度不为 $N$,你的程序将被判定为 **Wrong Answer [1]**。
- $Z[k]$($0 \le k \le N-1$)必须是从城市 $0$ 到城市 $k$ 所需的最小总票价。特别地,需满足 $Z[0] = 0$。
你的程序可在本文件中调用以下函数:
- `void SendA(bool y)`
使用此函数向 Baijan 发送一个字符。
- 参数 $y$ 表示要发送给 Baijan 的字符:`true` 代表字符 1,`false` 代表字符 0。
第二个文件的名称为 `Baijan.cpp`。它表示 Baijan 的行为,应实现以下函数。该文件应包含 `Baijan.h`。
- `void InitB(int N, int B, std::vector S, std::vector T, std::vector D)`
此函数在程序开始时恰好执行一次。
- 参数 $N$ 是城市数量 $N$。
- 参数 $B$ 是公交线路数量 $B$。
- 参数 $S$、$T$ 是长度为 $B$ 的数组。$S[j]$ 和 $T[j]$ 是由公交线路 $j$($0 \le j \le B-1$)连接的两座城市 $S_j$ 与 $T_j$。
- 参数 $D$ 是长度为 $B$ 的数组。$D[j]$ 是公交线路 $j$($0 \le j \le B-1$)的票价 $D_j$。
- `void ReceiveB(bool y)`
此函数在 Azer 每发送一个字符时执行一次。
- 参数 $y$ 表示 Azer 发送的字符:`true` 代表字符 1,`false` 代表字符 0。
你的程序可在本文件中调用以下函数:
- `void SendB(bool x)`
使用此函数向 Azer 发送一个字符。
- 参数 $x$ 表示要发送给 Azer 的字符:`true` 代表字符 1,`false` 代表字符 0。
你可以假设程序按如下方式执行。对于每个测试用例,准备两个队列:$Q_Y$,用于存储 Azer 发送的字符;以及 $Q_X$,用于存储 Baijan 发送的字符。首先,执行 `InitA` 和 `InitB`,并将发送的字符推入对应的队列。
- 若 $Q_X$ 或 $Q_Y$ 非空,则从其中一个队列中弹出一个字符,并执行对应的 `ReceiveA` 或 `ReceiveB`。然而,若 $Q_X$ 与 $Q_Y$ 均非空,则无法确定执行 `ReceiveA` 还是 `ReceiveB`。
- 当在 `ReceiveA` 执行期间调用 `SendA` 时,所发送的字符将被推入 $Q_Y$。
- 当在 `ReceiveB` 执行期间调用 `SendB` 时,所发送的字符将被推入 $Q_X$。
- 若两个队列均为空,则执行 `Answer`,程序结束。
Azer 与 Baijan 发送的字符总数应小于或等于 58000。若超过该限制,你的程序将被判定为 **Wrong Answer [2]**。
### 重要提示
- 你的程序可为内部用途实现其他函数,或使用全局变量。提交的文件将与评测程序一起编译,生成一个可执行文件。所有全局变量与内部函数应声明于一个未命名命名空间中,以避免与其他文件冲突。在评测时,程序将作为 Azer 与 Baijan 两个独立进程运行。Azer 进程与 Baijan 进程不能共享全局变量。
- 你的程序不应使用标准输入与标准输出。你的程序不应以任何方式与其他文件通信。然而,你的程序可向标准错误输出调试信息。
输入格式
示例评测程序从标准输入读取如下格式的数据:
$N\ A\ B$
$U_0\ V_0\ C_0$
$\vdots$
$U_{A-1}\ V_{A-1}\ C_{A-1}$
$S_0\ T_0\ D_0$
$\vdots$
$S_{B-1}\ T_{B-1}\ D_{B-1}$
输出格式
示例评测程序将以下信息写入标准输出和标准错误(为清晰起见,此处使用引号):
- 若你的程序被判定为 **Wrong Answer [1]** 或 **Wrong Answer [2]**,它会将类型写作 “Wrong Answer [1]” 输出至标准错误,且不会向标准输出写入任何内容。
- 否则,它会将发送字符的总数 $L$ 以 “Accepted: L” 的形式写入标准错误。同时,它会按以下格式将你的答案 $Z$ 写入标准输出:
$Z[0]$
$\vdots$
$Z[N - 1]$
示例评测程序不会检查 $Z$ 的值是否正确。
若你的程序被判定为多种类型的 **Wrong Answer**,示例评测程序仅报告其中一种。
说明/提示
### 数据范围
- $1 \le N \le 2000$。
- $0 \le A \le 500000$。
- $0 \le B \le 500000$。
- $0 \le U_i \le N - 1$($0 \le i \le A - 1$)。
- $0 \le V_i \le N - 1$($0 \le i \le A - 1$)。
- $U_i \ne V_i$($0 \le i \le A - 1$)。
- $(U_{i_1}, V_{i_1}) \ne (U_{i_2}, V_{i_2})$ 且 $(U_{i_1}, V_{i_1}) \ne (V_{i_2}, U_{i_2})$($0 \le i_1 < i_2 \le A - 1$)。
- $0 \le S_j \le N - 1$($0 \le j \le B - 1$)。
- $0 \le T_j \le N - 1$($0 \le j \le B - 1$)。
- $S_j \ne T_j$($0 \le j \le B - 1$)。
- $(S_{j_1}, T_{j_1}) \ne (S_{j_2}, T_{j_2})$ 且 $(S_{j_1}, T_{j_1}) \ne (T_{j_2}, S_{j_2})$($0 \le j_1 < j_2 \le B - 1$)。
- 任意两座城市之间均可通过铁路和/或公交线路到达。
- $1 \le C_i \le 500$($0 \le i \le A - 1$)。
- $1 \le D_j \le 500$($0 \le j \le B - 1$)。
### 子任务
1. (6 分)$A = 0$。
2. (8 分)$B \le 1000$。
3. (8 分)$A + B = N - 1$。
4. (38 分)$N \le 900$。
5. (14 分)$N \le 1100$。
6. (10 分)$N \le 1400$。
7. (16 分)无额外约束。
翻译由 Qwen3-235B 完成