#4446. 冒险者之旅 / The Adventurer's Journey

冒险者之旅 / The Adventurer's Journey

题目描述

高桥君是一名冒险者,正在穿越一片包含 NN 个城镇的大陆。

城镇编号为 11NN,有 MM 条道路连接城镇。第 ii 条道路双向连接城镇 UiU_i 和城镇 ViV_i,通过这条道路需要消耗 WiW_i 点体力。

高桥君的初始体力为 FF。他从城镇 11 出发,想要到达城镇 NN

每个城镇 jj 都有一家旅馆,恢复量为 RjR_j。当高桥君首次访问某个城镇时,该城镇的旅馆会恢复 RjR_j 点体力。这种恢复每个城镇只生效一次——如果多次访问同一城镇,从第二次起不再恢复。注意体力没有上限(可以通过恢复无限增长)。

城镇 11 在出发时视为首次访问。因此,在第一次移动之前,高桥君的体力为 F+R1F + R_1

高桥君的移动按以下步骤循环进行:

  1. 高桥君选择一条与当前城镇相连的道路。但他只能选择体力消耗(WiW_i)不超过当前体力的道路。如果没有满足条件的道路,高桥君无法继续移动。
  2. 沿选定的道路移动,体力减少 WiW_i。体力恰好变为 00 也是允许的。
  3. 到达目标城镇后,如果是首次访问该城镇,则旅馆恢复量 RjR_j 加到体力上。

高桥君可以多次通过同一条道路,也可以多次访问同一个城镇(但旅馆恢复每个城镇只有一次)。

考虑高桥君从城镇 11 到达城镇 NN 的所有可能移动方式,求到达城镇 NN 时体力的最大值。这里,到达城镇 NN 时的体力是指应用上述步骤 3 之后的体力(如果城镇 NN 是首次访问,则包括城镇 NN 的旅馆恢复)。

如果无论如何都无法到达城镇 NN,输出 -1

输入格式

第一行三个整数 N,M,FN, M, F

第二行 NN 个整数 R1,R2,,RNR_1, R_2, \ldots, R_N

接下来 MM 行,每行三个整数 Ui,Vi,WiU_i, V_i, W_i,表示一条道路。

输出格式

输出高桥君从城镇 11 到达城镇 NN 时体力的最大值。如果无法到达城镇 NN,输出 -1

3 2 10
5 3 7
1 2 8
2 3 6
11
3 1 5
0 0 0
1 2 3
-1
5 6 10
5 100 3 2 8
1 2 12
1 3 5
2 3 8
2 5 10
3 4 3
4 5 3
103
8 10 50
10 20 30 40 50 15 25 100
1 2 30
1 3 40
1 6 35
2 3 25
3 4 20
3 8 80
4 5 15
5 8 10
6 7 20
7 8 30
200
2 1 0
1000 1000
1 2 1000
1000

数据范围

  • 2N102 \leq N \leq 10
  • 1MN(N1)21 \leq M \leq \frac{N(N-1)}{2}
  • 0F10000 \leq F \leq 1000
  • 0Rj10000 \leq R_j \leq 1000
  • 1Ui<ViN1 \leq U_i < V_i \leq N
  • 1Wi10001 \leq W_i \leq 1000
  • 任意两个城镇之间最多有一条道路
  • 输入均为整数

提示

本题考查状态压缩DP。由于 N10N \leq 10,可以用一个 NN 位二进制数表示已访问的城镇集合。

dp[mask][v]dp[mask][v] 表示已访问城镇集合为 maskmask,当前在城镇 vv 时的最大体力。

转移时,尝试从当前城镇 vv 移动到相邻城镇 uu,更新状态。

时间复杂度 O(2NN2)O(2^N \cdot N^2),空间复杂度 O(2NN)O(2^N \cdot N)

来源

AtCoder AWC 0052E