P11343 [KTSC 2023 R1] 出租车旅行

题目背景

**请勿用 C++14 (GCC 9) 提交。** 请在程序开头加入如下代码: ```cpp #include std::vector travel(std::vector A, std::vector B, std::vector U, std::vector V, std::vector W); ```

题目描述

**题目译自 [2023년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사](https://www.ioikorea.kr/archives/ioitst/2023/) T3 「[택시 여행](https://assets.ioikorea.kr/ioitst/2023/1/taxi/taxi_statement.pdf)」** IOI 国由 $N$ 个城市和连接这些城市的 $N-1$ 条双向道路组成,任意两个不同的城市都可以通过这些道路互相到达。也就是说,IOI 国的道路网络是一个树结构。 每个城市都有一个编号,从 $0$ 到 $N-1$,其中 $0$ 号城市是 IOI 国的首都。对于每个 $i$ $(0 \leq i \leq N-2)$,第 $i$ 条道路连接 $U[i]$ 号城市和 $V[i]$ 号城市,道路长度为 $W[i]$ 公里。 在 IOI 国,不同城市的出租车费用不同。具体来说,对于每个 $i$ $(0 \leq i \leq N-1)$,从 $i$ 号城市出发的出租车有一个基本费用 $A[i]$ 元和每公里的费用 $B[i]$ 元。这意味着,如果从 $i$ 号城市出发并行驶 $d$ 公里,需要支付 $A[i] + d \times B[i]$ 元。 小明目前住在首都 $0$ 号城市,他计划乘坐出租车去其他城市旅行。当他到达一个城市时,可以选择继续乘坐当前的出租车,或者换乘该城市出发的出租车。当然,换乘出租车需要支付基本费用,并且每公里的费用也可能不同。请计算从 0 号城市出发到达其他所有城市的最小费用。 你需要实现以下函数: ```cpp vector travel(vector A, vector B, vector U, vector V, vector W); ``` - 该函数只会被调用一次。 - `A`:大小为 $N$ 的整数数组。对于每个 $i$ $(0 \leq i \leq N-1)$,$A[i]$ 是从 $i$ 号城市出发的出租车的基本费用。 - `B`:大小为 $N$ 的整数数组。对于每个 $i$ $(0 \leq i \leq N-1)$,$B[i]$ 是从 $i$ 号城市出发的出租车的每公里费用。 - `U, V, W`:大小为 $N-1$ 的整数数组。对于每个 $i$ $(0 \leq i \leq N-2)$,$U[i]$ 号城市和 $V[i]$ 号城市之间有一条长度为 $W[i]$ 公里的道路。 - 该函数返回一个大小为 $N-1$ 的数组 $C$。对于每个 $i$ $(0 \leq i \leq N-2)$,$C[i]$ 是从 $0$ 号城市出发到达 $i+1$ 号城市的最小费用。 注意,提交的代码中不应包含任何输入输出操作。

输入格式

示例评测程序按以下格式读取输入: - 第 $1$ 行:$N$ - 第 $2$ 行:$A[0]\,A[1]\,\cdots\,A[N-1]$ - 第 $3$ 行:$B[0]\,B[1]\,\cdots\,B[N-1]$ - 第 $4+i$ $(0 \leq i \leq N-2)$ 行:$U[i]\,V[i]\,W[i]$

输出格式

示例评测程序按以下格式输出: - 第 $i$ 行:函数 `travel` 返回的数组的第 $i$ 个元素

说明/提示

### 样例解释 考虑 $N=5, A=[10,5,13,4,3], B=[10,7,5,9,1], U=[1,0,3,2], V=[0,2,2,4], W=[1,5,10,3]$ 的情况。 评测程序将调用如下函数: ```cpp travel([10, 5, 13, 4, 3], [10, 7, 5, 9, 1], [1, 0, 3, 2], [0, 2, 2, 4], [1, 5, 10, 3]); ``` - 从 $0$ 号城市到 $1$ 号城市的最优方案是直接从 $0$ 号城市乘坐出租车,总费用为 $20$ 元。 - 从 $0$ 号城市到 $2$ 号城市的最优方案是直接从 $0$ 号城市乘坐出租车,总费用为 $60$ 元。 - 从 $0$ 号城市到 $4$ 号城市的最优方案是先从 $0$ 号城市乘坐出租车到 $1$ 号城市,然后换乘,再经过 $0$ 号和 $2$ 号城市到达 $4$ 号城市,总费用为 $88$ 元。 - 从 $0$ 号城市到 $3$ 号城市的最优方案是先从 $0$ 号城市乘坐出租车到 $1$ 号城市,然后换乘,再经过 $0$ 号和 $2$ 号城市到达 $4$ 号城市,再换乘,经过 $2$ 号城市到达 $3$ 号城市,总费用为 $104$ 元。 函数应返回 `[20, 60, 104, 88]`。 ### 数据范围 对于所有输入数据,满足: - $2 \leq N \leq 10^5$ - 对于所有 $i$ $(0 \leq i \leq N-1)$,$0 \leq A[i] \leq 10^{12}$ - 对于所有 $i$ $(0 \leq i \leq N-1)$,$0 \leq B[i] \leq 10^6$ - 对于所有 $i$ $(0 \leq i \leq N-2)$,$0 \leq U[i], V[i] \leq N-1 ; U[i] \neq V[i]$ - 对于所有 $i$ $(0 \leq i \leq N-2)$,$1 \leq W[i] \leq 10^6$ 详细子任务附加限制及分值如下表所示。 | 子任务 | 分值 | 附加限制 | | :-: | :-: | :-: | | $1$ | $7$ | $N \leq 20$ | | $2$ | $8$ | 对于所有 $i$ $(0 \leq i \leq N-2)$,$U[i]=i ; V[i]=i+1$ | | $3$ | $13$ | $N \leq 2000$ | | $4$ | $17$ | 对于所有 $i$ $(0 \leq i \leq N-1)$,$B[i] \leq 30$ | | $5$ | $29$ | $B[i] \neq 0$ $(0 \leq i \leq N-1)$ 的 $i$ 不超过 $2000$ 个 | | $6$ | $26$ | 无附加限制 |