codeforces 821D(状压构图+最短路径)
codeforces
图论
构图
最短路径
题目大意
有n*m个城市排成n行m列的矩形,相邻的城市可以互相通过。Okabe要从(1,1)走到(n,m),但是Okabe十分怕黑,所以走过的城市必须是亮的才能通过。已知有k个城市是永远亮的,其他城市都是暗的。除此之外,Okabe可以在任何一个永久都亮的城市发动魔法,让某一行或某一列暗的城市都暂时变亮。注意,两次魔法效果不能共存,也就是说,如果已经发动了魔法,再要发动魔法的话,上一次发动的魔法效果就会先消失(非永久亮的城市变回暗的),然后再发动新的魔法效果(所以如果站在暂时亮的城市发动新的魔法,就会GG)。问最少使用多少次魔法,能够使Okabe从(1,1)走到(n,m)。不能走到输出-1。
2≤n,m,k≤104
解答
把永久都亮的城市,和n行、m列都看成点,共n+m+k个点。那么连边只有三种关系。
- 点到点,永久亮的点,到四个方向永久亮的点,花费是0。
- 点到线(一行或一列),永久亮的点到和3个行、3个列,花费是1。
- 线到点,行或列到与其挨着的永久亮的点,花费是0。
总边数不超过4k+9k+9k=22k。
这些关系的维护,可以用set,vector来实现。
最后的结果,要么是走到(n,m),要么是走到第n行或第m列。
我的代码是一边做最短路,一边加点构图,加了的点放在map里。(一开始我以为暂时亮的城市时间很短,所以经过暂时亮的城市之后必须马上到永久亮的城市,都是点和点的关系,发现题意理解错了之后,随便改了改加上了点和线的关系)