洛谷P4011:孤岛营救

问题描述

1 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩。瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图。迷宫的外形是一个长方形,其南北方向被划分为 NN 行,东西方向被划分为 MM 列,于是整个迷宫被划分为 N\times MN×M 个单元。每一个单元的位置可用一个有序数对(单元的行号,单元的列号)来表示。南北或东西方向相邻的 22 个单元之间可能互通,也可能有一扇锁着的门,或者是一堵不可逾越的墙。迷宫中有一些单元存放着钥匙,并且所有的门被分成PP 类,打开同一类的门的钥匙相同,不同类门的钥匙不同。

大兵瑞恩被关押在迷宫的东南角,即 (N,M)(N,M) 单元里,并已经昏迷。迷宫只有一个入口,在西北角。也就是说,麦克可以直接进入 (1,1)(1,1) 单元。另外,麦克从一个单元移动到另一个相邻单元的时间为 11 ,拿取所在单元的钥匙的时间以及用钥匙开门的时间可忽略不计。

试设计一个算法,帮助麦克以最快的方式到达瑞恩所在单元,营救大兵瑞恩。

思路与解法

      这题大家看到的题解中肯定有很多bfs+状压的做法,因为那样很简单,入门题目,解法不用多说,搞个三维数组存状态即可。

      但是,既然要把他归到网路流专题里面,我们就需要好好想一想。

      1.其实是一个费用流的问题,但是这个边应该怎么建呢?我们想一想,如果一个点与另一个点联通的话,那么他们肯定属于同一个bfs集里面。

      2.每当输入一个钥匙的位置与它的编号时,我们就把他放进bfs一遍,然后带着他自己所对应编号的钥匙,通过沿途的门,然后把能遍历到的点,都向他们连一条1流量费用的边(d为钥匙位置到该位置的bfs长度)。

      3.当然,其他点到四周可以去到的点都要连一条边,最后跑一遍费用流即可(但是真的只用跑一遍,因为我们只要求到汇点1流量的费用最小值)。

      4.附加点:就是说,注意边界的判定与循环队列的开放。

完了

      今天说到这里,就不放代码了,想想,很简单的。
      像我这种都蒟蒻不用看题解。。。


你可能感兴趣的:(洛谷P4011:孤岛营救)