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\) 行,每行一个整数表示答案
数据范围
做法:
注意到 \(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\) 的最短耗时,答案就是:
空间 \(O(mn)\) 。
时间 \(O(mn\log n+qm)\) 。
如果被卡常,记得交换 \(d1\) 和 \(d2\) 的维度,这样查询要快很多,实测 \(4-5\) 倍。

浙公网安备 33010602011771号