Related
In following contests:
状态记成 (i,c):人已经进入卡口 i,并且已经用掉 c 次反向。边权是进入下一个卡口的时刻,时刻只增不减,所以在这个状态图上做堆优化最短路。
出发时刻是 0。起点也要先进入自己的时间窗,进入时刻是 max(0,Ls)。若 0>Rs,起点就进不去,直接输出 −1。约束里 Rs≥0,这一支不会发生,代码仍按题意判断。
每条通道拆成两条有向边。从 u 到 v 耗时 w,不增加反向次数;从 v 到 u 耗时 z,反向次数加 1。设当前进入时刻是 x,沿某条边到达下一卡口的时刻是 y=x+ 耗时。若 y>R,这条边不能走。否则进入时刻是 max(y,L)。进入以后必须马上离开,所以下一跳的出发时刻就是这个进入时刻。
反向次数超过 K 的状态直接丢掉。堆按进入时刻从小到大弹出。第一次弹出终点时,三种反向次数里最早的那个已经确定,就是答案。所有状态都处理完仍没到终点,输出 −1。
某厂区设有 n 个卡口和 m 条通道,卡口编号为 1 至 n。
巡检人员需要从卡口 s 出发,前往卡口 t(s=t),出发时刻为 0。
每个卡口 i 都有一个允许进入的时间窗 [Li,Ri]。若巡检人员在时刻 x 到达卡口 i,则:
巡检人员进入卡口后必须立即离开,不允许在卡口内额外等待。起点 s 同样受时间窗限制,即巡检人员需要先进入卡口 s,再从该卡口出发。
每条通道由四个整数 u,v,w,z 描述,表示该通道允许以下两种通行方式:
巡检人员最多可以反向通行 K 次。
每条通道在一次巡检路径中最多使用一次,无论正向还是反向。输入中的每条通道均视为独立通道,即使其连接的卡口相同。
请计算巡检人员最早进入卡口 t 的时刻。如果不存在满足要求的巡检路径,输出 −1。
第一行包含三个整数 n、m、K,分别表示卡口数量、通道数量和允许的最大反向通行次数。
第二行包含两个整数 s、t,表示起点和终点。
接下来 n 行,每行包含两个整数 Li、Ri,表示卡口 i 的进入时间窗。
接下来 m 行,每行包含四个整数 u、v、w、z,表示一条通道:正向从 u 到 v 耗时 w,反向从 v 到 u 耗时 z。
2≤n≤105
0≤m≤2×105
0≤K≤10
1≤s,t≤n,且 s=t
0≤Li≤Ri≤109
1≤u,v≤n,且 u=v
1≤w,z≤109
保证存在合法路径时,答案不超过 1018。
输出一个整数,表示最早进入卡口 t 的时刻。如果无法到达,输出 −1。
输入
4 5 1
1 4
0 50
10 12
0 4
12 40
1 2 4 4
2 3 1 1
3 4 10 10
4 2 100 3
1 4 25 25
输出
13
说明
选择路径 1→2→4。
巡检人员在时刻 0 从卡口 1 出发,正向经过通道 1→2,耗时 4,在时刻 4 到达卡口 2。
由于卡口 2 的进入时间窗为 [10,12],巡检人员需要等待至时刻 10 才能进入并离开。
随后反向使用通道 4→2,从卡口 2 前往卡口 4,耗时 3,在时刻 13 进入终点。
该路径使用了一次反向通行,满足限制,最早进入终点的时刻为 13。
输入
3 4 1
1 3
0 100
0 100
0 100
2 1 100 1
1 2 6 100
3 2 100 1
2 3 10 100
输出
7
说明
选择路径 1→2→3。
首先正向使用通道 1→2,耗时 6,在时刻 6 进入卡口 2。
随后反向使用通道 3→2,耗时 1,在时刻 7 进入卡口 3。
虽然可以通过连续两次反向通行在时刻 2 到达终点,但反向次数超过 K=1,因此不合法。
故最早进入终点的时刻为 7。
In following contests:
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册