#P14345. [JOISC 2019] 两种交通 / Two Transportations

    ID: 16144 远端评测题 3000ms 256MiB 尝试: 0 已通过: 0 难度: 6 上传者: 标签>2019交互题Special Judge最短路通信题JOISC/JOIST(日本)

[JOISC 2019] 两种交通 / Two Transportations

题目背景

请使用 C++ 20 提交。不要引入头文件,并在文件头粘贴如下内容:

#include <vector>
void InitA(int, int, std::vector<int>, std::vector<int>, std::vector<int>);
void ReceiveA(bool);
std::vector<int> Answer();
void SendA(bool);
void InitB(int, int, std::vector<int>, std::vector<int>, std::vector<int>);
void ReceiveB(bool);
void SendB(bool);

题目描述

JOI 国有 NN 座城市,编号从 00N1N-1。有 AA 条铁路线,编号从 00A1A-1。铁路线 ii0iA10 \le i \le A-1)双向连接城市 UiU_i 与城市 ViV_i,票价为 CiC_i。不同的铁路线连接不同的城市对。另有 BB 条公交线路,编号从 00B1B-1。公交线路 jj0jB10 \le j \le B-1)双向连接城市 SjS_j 与城市 TjT_j,票价为 DjD_j。不同的公交线路连接不同的城市对,但一条铁路线与一条公交线路可能连接相同的城市对。通过铁路和/或公交,可以在任意两座城市之间通行。

Azer 想知道从城市 00 到每个城市的最小总票价。由于 Azer 仅了解铁路线的信息,他与仅了解公交线路信息的 Baijan 合作。

他们通过发送和接收字符 0 或 1 进行通信。发送的字符总数应小于或等于 58000。

编写程序,Azer 的程序接收铁路线信息,Baijan 的程序接收公交线路信息,二者通过通信协作,帮助 Azer 找到从城市 00 到每个城市的最小总票价。

实现细节

你需要实现两个文件。

第一个文件的名称为 Azer.cpp。它表示 Azer 的行为,应实现以下函数。该文件应包含 Azer.h

  • void InitA(int N, int A, std::vector<int> U, std::vector<int> V, std::vector<int> C)
    此函数在程序开始时恰好执行一次。
    • 参数 NN 是城市数量 NN
    • 参数 AA 是铁路线数量 AA
    • 参数 UUVV 是长度为 AA 的数组。U[i]U[i]V[i]V[i] 是由铁路线 ii0iA10 \le i \le A-1)连接的两座城市。
    • 参数 CC 是长度为 AA 的数组。C[i]C[i] 是铁路线 ii0iA10 \le i \le A-1)的票价 CiC_i
  • void ReceiveA(bool x)
    此函数在 Baijan 每发送一个字符时执行一次。
    • 参数 xx 表示 Baijan 发送的字符:true 代表字符 1,false 代表字符 0。
  • std::vector<int> Answer()
    此函数在所有发送的字符均被接收后恰好执行一次。该函数必须返回一个数组 ZZ,其中包含从城市 00 到每个城市的最小总票价。
    • 返回值 ZZ 必须是一个长度为 NN 的数组。若其长度不为 NN,你的程序将被判定为 Wrong Answer [1]
    • Z[k]Z[k]0kN10 \le k \le N-1)必须是从城市 00 到城市 kk 所需的最小总票价。特别地,需满足 Z[0]=0Z[0] = 0

你的程序可在本文件中调用以下函数:

  • void SendA(bool y)
    使用此函数向 Baijan 发送一个字符。
    • 参数 yy 表示要发送给 Baijan 的字符:true 代表字符 1,false 代表字符 0。

第二个文件的名称为 Baijan.cpp。它表示 Baijan 的行为,应实现以下函数。该文件应包含 Baijan.h

  • void InitB(int N, int B, std::vector<int> S, std::vector<int> T, std::vector<int> D)
    此函数在程序开始时恰好执行一次。
    • 参数 NN 是城市数量 NN
    • 参数 BB 是公交线路数量 BB
    • 参数 SSTT 是长度为 BB 的数组。S[j]S[j]T[j]T[j] 是由公交线路 jj0jB10 \le j \le B-1)连接的两座城市 SjS_jTjT_j
    • 参数 DD 是长度为 BB 的数组。D[j]D[j] 是公交线路 jj0jB10 \le j \le B-1)的票价 DjD_j
  • void ReceiveB(bool y)
    此函数在 Azer 每发送一个字符时执行一次。
    • 参数 yy 表示 Azer 发送的字符:true 代表字符 1,false 代表字符 0。

你的程序可在本文件中调用以下函数:

  • void SendB(bool x)
    使用此函数向 Azer 发送一个字符。
    • 参数 xx 表示要发送给 Azer 的字符:true 代表字符 1,false 代表字符 0。

你可以假设程序按如下方式执行。对于每个测试用例,准备两个队列:QYQ_Y,用于存储 Azer 发送的字符;以及 QXQ_X,用于存储 Baijan 发送的字符。首先,执行 InitAInitB,并将发送的字符推入对应的队列。

  • QXQ_XQYQ_Y 非空,则从其中一个队列中弹出一个字符,并执行对应的 ReceiveAReceiveB。然而,若 QXQ_XQYQ_Y 均非空,则无法确定执行 ReceiveA 还是 ReceiveB
  • 当在 ReceiveA 执行期间调用 SendA 时,所发送的字符将被推入 QYQ_Y
  • 当在 ReceiveB 执行期间调用 SendB 时,所发送的字符将被推入 QXQ_X
  • 若两个队列均为空,则执行 Answer,程序结束。

Azer 与 Baijan 发送的字符总数应小于或等于 58000。若超过该限制,你的程序将被判定为 Wrong Answer [2]

重要提示

  • 你的程序可为内部用途实现其他函数,或使用全局变量。提交的文件将与评测程序一起编译,生成一个可执行文件。所有全局变量与内部函数应声明于一个未命名命名空间中,以避免与其他文件冲突。在评测时,程序将作为 Azer 与 Baijan 两个独立进程运行。Azer 进程与 Baijan 进程不能共享全局变量。
  • 你的程序不应使用标准输入与标准输出。你的程序不应以任何方式与其他文件通信。然而,你的程序可向标准错误输出调试信息。

输入格式

示例评测程序从标准输入读取如下格式的数据:

N A BN\ A\ B

U0 V0 C0U_0\ V_0\ C_0

\vdots

UA1 VA1 CA1U_{A-1}\ V_{A-1}\ C_{A-1}

S0 T0 D0S_0\ T_0\ D_0

\vdots

SB1 TB1 DB1S_{B-1}\ T_{B-1}\ D_{B-1}

输出格式

示例评测程序将以下信息写入标准输出和标准错误(为清晰起见,此处使用引号):

  • 若你的程序被判定为 Wrong Answer [1]Wrong Answer [2],它会将类型写作 “Wrong Answer [1]” 输出至标准错误,且不会向标准输出写入任何内容。

  • 否则,它会将发送字符的总数 LL 以 “Accepted: L” 的形式写入标准错误。同时,它会按以下格式将你的答案 ZZ 写入标准输出:

    Z[0]Z[0]

    \vdots

    Z[N1]Z[N - 1]

    示例评测程序不会检查 ZZ 的值是否正确。

若你的程序被判定为多种类型的 Wrong Answer,示例评测程序仅报告其中一种。

4 3 4
0 1 6
2 1 4
2 0 10
1 2 3
3 1 1
3 2 3
3 0 7

提示

数据范围

  • 1N20001 \le N \le 2000
  • 0A5000000 \le A \le 500000
  • 0B5000000 \le B \le 500000
  • 0UiN10 \le U_i \le N - 10iA10 \le i \le A - 1)。
  • 0ViN10 \le V_i \le N - 10iA10 \le i \le A - 1)。
  • UiViU_i \ne V_i0iA10 \le i \le A - 1)。
  • (Ui1,Vi1)(Ui2,Vi2)(U_{i_1}, V_{i_1}) \ne (U_{i_2}, V_{i_2})(Ui1,Vi1)(Vi2,Ui2)(U_{i_1}, V_{i_1}) \ne (V_{i_2}, U_{i_2})0i1<i2A10 \le i_1 < i_2 \le A - 1)。
  • 0SjN10 \le S_j \le N - 10jB10 \le j \le B - 1)。
  • 0TjN10 \le T_j \le N - 10jB10 \le j \le B - 1)。
  • SjTjS_j \ne T_j0jB10 \le j \le B - 1)。
  • (Sj1,Tj1)(Sj2,Tj2)(S_{j_1}, T_{j_1}) \ne (S_{j_2}, T_{j_2})(Sj1,Tj1)(Tj2,Sj2)(S_{j_1}, T_{j_1}) \ne (T_{j_2}, S_{j_2})0j1<j2B10 \le j_1 < j_2 \le B - 1)。
  • 任意两座城市之间均可通过铁路和/或公交线路到达。
  • 1Ci5001 \le C_i \le 5000iA10 \le i \le A - 1)。
  • 1Dj5001 \le D_j \le 5000jB10 \le j \le B - 1)。

子任务

  1. (6 分)A=0A = 0
  2. (8 分)B1000B \le 1000
  3. (8 分)A+B=N1A + B = N - 1
  4. (38 分)N900N \le 900
  5. (14 分)N1100N \le 1100
  6. (10 分)N1400N \le 1400
  7. (16 分)无额外约束。

翻译由 Qwen3-235B 完成