codeforces 821D(状压构图+最短路径)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuxufanzhong/article/details/73801270

codeforces 821D(状压构图+最短路径)

codeforces 图论 构图 最短路径

题目链接

题目大意

有n*m个城市排成n行m列的矩形,相邻的城市可以互相通过。Okabe要从(1,1)走到(n,m),但是Okabe十分怕黑,所以走过的城市必须是亮的才能通过。已知有k个城市是永远亮的,其他城市都是暗的。除此之外,Okabe可以在任何一个永久都亮的城市发动魔法,让某一行或某一列暗的城市都暂时变亮。注意,两次魔法效果不能共存,也就是说,如果已经发动了魔法,再要发动魔法的话,上一次发动的魔法效果就会先消失(非永久亮的城市变回暗的),然后再发动新的魔法效果(所以如果站在暂时亮的城市发动新的魔法,就会GG)。问最少使用多少次魔法,能够使Okabe从(1,1)走到(n,m)。不能走到输出-1。

2n,m,k104

解答

把永久都亮的城市,和n行、m列都看成点,共n+m+k个点。那么连边只有三种关系。

  • 点到点,永久亮的点,到四个方向永久亮的点,花费是0。
  • 点到线(一行或一列),永久亮的点到和3个行、3个列,花费是1。
  • 线到点,行或列到与其挨着的永久亮的点,花费是0。

总边数不超过4k+9k+9k=22k。

这些关系的维护,可以用set,vector来实现。

最后的结果,要么是走到(n,m),要么是走到第n行或第m列。

通过代码

我的代码是一边做最短路,一边加点构图,加了的点放在map里。(一开始我以为暂时亮的城市时间很短,所以经过暂时亮的城市之后必须马上到永久亮的城市,都是点和点的关系,发现题意理解错了之后,随便改了改加上了点和线的关系)

猜你喜欢

转载自blog.csdn.net/wuxufanzhong/article/details/73801270