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

2 篇文章 0 订阅
2 篇文章 0 订阅

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里。(一开始我以为暂时亮的城市时间很短,所以经过暂时亮的城市之后必须马上到永久亮的城市,都是点和点的关系,发现题意理解错了之后,随便改了改加上了点和线的关系)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值