P15441 [蓝桥杯 2025 国 Python/Java 研究生组] 耗时最短的路径

题目描述

探险者需要穿越一个充满时空裂隙的迷宫,共包含有 $n$ 个时空裂隙(简称结点),编号为 $1 \sim n$,探险者可以在结点任意停留。在时空裂隙之间存在着 $m$ 条路径,每条路径可以描述为 $(u_i, v_i, w_i, s_i, e_i)$ 表示从结点 $u_i$ 到结点 $v_i$ 存在着一条双向路径,通过这条路径需要耗时 $w_i$,且只有当前时刻位于 $[s_i, e_i]$ 的区间才可以进入这条路径并通过(因此经过这条路径到达 $v_i$ 的时刻必然在 $[s_i + w_i, e_i + w_i]$ 区间内)。 同时,探险者有调整时间流速的机会:即可以在某一次通过路径时忽略 $[s_i, e_i]$ 的时间限制,这样的技能最多使用 $k$ 次。 初始时,探险者在 $1$ 号结点,初始时刻为 $0$。请问从结点 $1$ 到达结点 $n$,需要消耗的最短时间是多少?

输入格式

输入的第一行包含三个整数 $n, m, k$,相邻整数之间使用一个空格分隔。 接下来 $m$ 行,每行包含五个整数 $u_i, v_i, w_i, s_i, e_i$,相邻整数之间使用一个空格分隔,表示第 $i$ 条路径的信息。图中可能出现重边和自环。

输出格式

输出一行包含一个整数表示答案,如果不存在可能的路径,输出整数 $-1$。

说明/提示

### 样例说明 对于样例 1:可以直接走 $1 \to 3$ 这条路径,耗时为 6;走 $1 \to 2 \to 3$ 耗时为 8,因为到达 2 之后需要等到时间 5 才可以继续前进。 对于样例 2:由于有一次释放技能的机会,先走 $1 \to 2$,然后使用一次技能从 $2 \to 3$,总耗时为 4。 ### 评测用例规模与约定 对于 $10\%$ 的评测用例,$2 \le n \le 5$; 对于 $20\%$ 的评测用例,$2 \le n \le 10$; 对于 $40\%$ 的评测用例,$2 \le n \le 100$; 对于 $60\%$ 的评测用例,$2 \le n \le 1000$; 对于 $80\%$ 的评测用例,$2 \le n \le 10000$; 对于所有评测用例,$2 \le n \le 50000$,$1 \le m \le \min\left(\dfrac{n(n-1)}{2}, 10^5\right)$,$0 \le k \le 10$,$1 \le u_i, v_i \le n$,$0 \le s_i, e_i \le 4 \times 10^3$。