# 高阶扩展:把等待周期压成 0-1 状态图 ## 本节目标 面对“绿灯内必须连续移动、红灯只能停在安全点”的时间规则,分离完整周期数与本周期已用时间,用 0-1 BFS 取代对绝对时间的搜索。 ## 前置知识与课前自测 前置:0-1 BFS、状态图、排序。 1. 若状态只记安全岛编号,会丢失什么? 2. 到达安全岛时绿灯恰好结束,与尚有余量的代价差别是什么? 3. 为什么只向排序后相邻安全岛转移仍不漏最优路线?
答案 1. 本轮绿灯还剩多少时间。 2. 前者必须经历一次红灯并把轮内进度清零;后者无需新增完整周期。 3. 同方向越过中间安全岛可拆成若干相邻段,总距离和轮内进度不变。
## 问题动机 以绝对时间建图会把大量只差完整周期数的状态分开;只记位置又无法判断当前绿灯是否还走得动。需要保留“相位”,把完整周期折叠进距离。 ## 精选例题:Nastya and Unexpected Guest ### 来源与题意 - VJudge:[CodeForces-1340C](https://vjudge.net/problem/CodeForces-1340C) - 原题:[Codeforces 1340C](https://codeforces.com/problemset/problem/1340/C) - 难度:2400;考点:周期状态、0-1 BFS、终点特殊处理 道路是 $[0,n]$,$n\le10^6$;有 $m\le10^4$ 个安全岛,含 0 与 $n$。绿灯 $g$ 秒、红灯 $r$ 秒,$g,r\le1000$。绿灯时每秒走一单位且不能停,只有安全岛可变向;红灯开始时必须在安全岛。求从 0 到 $n$ 的最短时间。
Hint 1状态设为 `(island, spent)`,其中 `spent` 是当前绿灯已经走的秒数。
Hint 2让距离只记录已经完整经历的“绿+红”周期数。
Hint 3移动后 `spent<g` 是 0 边;`spent==g` 必须等待红灯、重置为 0,是 1 边。
Hint 4到终点即结束;若恰在第 $g$ 秒到达终点,不能把最后一段红灯算进去。
## Observations 与 Editorial 绝对时间可很大,但规则只关心时间在周期中的相位。定义状态 $(i,s)$:人在第 $i$ 个安全岛,当前绿灯已经走 $s$ 秒,$0\le sg$ 不合法; - $s+d