P1813加强版

P1813 加强版

题目描述

给定一个 \(n\) 个点,\(m\) 条边的有向图,每条边由 \((s, t, b, e, c)\) 五个数组成,分别代表起点,终点,可通行时间段,通行时间,你通过这条边的整个时间段都需要在可通行时间段内(即你只能从一个时间 \(T \in [b, e - c]\) 从 \(s\) 出发花费 \(c\) 的时间在 \(T + c\) 通过这条边走到 \(t\))

\(q\) 组询问,每次给定 \(st\) 和 \(ed\),求从任意时刻开始 \(st\) 到 \(ed\) 所需的最短时间(即你可以自由选择出发时间 \(t1\),设 \(t1\) 在某种方案中到达 \(ed\) 的时间为 \(t2\),要求的就是 \(t2 - t1\) 的最小值)

不存在从 \(st\) 到 \(ed\) 的合法路径输出 \(-1\) 。

输入格式

第一行,三个整数 \(n, m, q\)

接下来 \(m\) 行,每行五个整数 \((s, t, b, e, c)\) 描述一条边

接下来 \(q\) 行,每行两个整数,代表这组询问的 \(st\) 和 \(ed\)

输出格式

共 \(q\) 行,每行一个整数表示答案

数据范围

\[1 \le n \le 1000, 1 \le m \le 2000, 1 \le q \le 10^5, 1 \le s, t \le n, 1 \le b \le e \le 10^{18}, 1 \le c \le \\10^{18} \]

做法:

注意到 \(b,e\) 很大,所以必定不能像原题一样枚举出发时间。

分析一下问题,发现一条耗时最短的路径一定存在某条边卡着上时限通过。

即一定存在某条边 \(i\) ,使得到达 \(s_i\) 的时间为 \(e_i-c_i\) ,通过其到达 \(t_i\) 的时间为 \(e_i\) 。

否则所有边的时限都没有满,那么就可以拖延一些时间出发。

这可以叫做化动为静,即把动态的出发时间能不能够拖延化为静态的边的时间有没有卡满。

然后我们对于每一条边 \(i\) ,统计:

  • \(s_i\) 在反图上从 \(e_i-c_i\) 时刻出发时间倒流的倒着走回其他点 \(j\) 的最小耗时,记为 \(d1[i][j]\) 。

  • \(t_i\) 在正图上从 \(e_i\) 时刻出发正着走到其他点 \(j\) 的最小耗时 ,记为 \(d2[i][j]\) 。

这两部分的处理是容易的。就是原题的做法。

查询时暴力枚举中间的边 \(i\) ,设查询 \(u→v\) 的最短耗时,答案就是:

\[\min_{i} d1[i][u]+d2[i][v]+c_i \]

空间 \(O(mn)\) 。

时间 \(O(mn\log n+qm)\) 。

如果被卡常,记得交换 \(d1\) 和 \(d2\) 的维度,这样查询要快很多,实测 \(4-5\) 倍。

posted @ 2026-10-22 08:22  wlhao  阅读(4)  评论(0)    收藏  举报