思路:

开放时间和出入时间必须是k的非负整数倍,可以考虑将图中的每一个点拆分成k个状态,也就是k个时间段。

常规dijstra:dist[i]表示到达第i个点的最短时间

k状态dijstra:dist[i][j]表示到达第i个点且时间 modmod k=jk = j 的最短时间。

显然:dist[1][0] = 0 而我们要求的答案为 dist[n][0]

若当前到达 u 号点,且时间是 p,u->v 边权为 w,如果 p < w,当前无法通过,我们可以在起点晚 k 的倍数时间出发,再走到这个点的时候就可以顺利通过了,可知等待时间是 wpkk\left \lceil \frac{w-p}{k} \right \rceil*k,消耗时间是wpkk+p\left \lceil \frac{w-p}{k} \right \rceil*k+p

状态转移:

如果 p >= w,可以直接通过: dist[i][(p+1)%k] = min(dist[i][(p+1)%k], p+1)

否则 令 t = wpkk+p\left \lceil \frac{w-p}{k} \right \rceil*k+p,即需要我们在起点等待一段时间再通过,转移为: dist[i][(t+1)%k] = min(dist[i][(t+1)%k], t+1)

0 条评论

目前还没有评论...

信息

ID
110
时间
1000ms
内存
256MiB
难度
10
标签
(无)
递交数
55
已通过
2
上传者