SGU 103 Traffic Lights

题意

http://www.nocow.cn/index.php/Translate:Sgu/103
翻译版,这里不重复劳动了

思路

这个题的可怕之处不是有多难想,而是虽然基本模型很简单就是图上最短路,但是这回有许多许多的限制条件。
正确地计算当前灯的状态是这个题最大的难点,我采用的方法是(其实我写跪了,李大神给我捞上来的):首先把到这个路口已经消耗的时间减去题目给的初始时间,我叫他有效时间,接下来把这个有效时间模上两种颜色的灯持续时间之和,剩下的时间是对灯的状态真正有影响的时间,接下来分别脑内模拟一下站在这个路灯时如果是紫色最后会怎么变,如果是蓝色会怎么变,然后基本就可以写出这个时间和最终颜色的关系了,还可以得到最终这个颜色还能再持续多长时间,这两条非常重要,一定要搞对。
接下来的难点就是计算从当前点移动到下一个点之前等待两点灯的颜色同步的时间,算这个就要依赖于上面的两个值:当前颜色和当前颜色还剩多长时间,假设我们要从A点移动到B,已经走了tim时间,那么我们就要分别计算A点和B点在tim时的这两个数据,然后如果AB在tim时颜色正好相等,那么无需等待直接通行,所以等待时间为0,如果颜色不同呢?只要看A和B哪个剩余的时间短,这个就是等待时间了。要是剩余的时间又一样?那就要脑内模拟一下了,然后发现我们可以再比较A的下一颜色和B的下一颜色谁的持续时间短,等待时间就是剩余时间+最短的持续时间。如果下一个颜色还一样,那就比较下下个颜色。要是还一样?对不起,hehe了,走别的吧~(所以说这个题很sxbk)
接下来是最段路部分,我们把权值设定为走到这个点要花多少时间,从当前点走到下一个点时,下一个点的可能值就是(当前点已用时间+等待两个点的灯同步的时间+路上消耗的时间),以此为基准进行松弛操作。

接下来上代码

 

Leave a Reply

Scroll to top