【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
【题意】
1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被
敌军俘虏的大兵瑞恩。 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的
地形图。 迷宫的外形是一个长方形, 其南北方向被划分为 N 行,东西方向被划分为 M 列,
于是整个迷宫被划分为 N× M 个单元。每一个单元的位置可用一个有序数对(单元的行号,
单元的列号)来表示。南北或东西方向相邻的 2 个单元之间可能互通, 也可能有一扇锁着的
门,或者是一堵不可逾越的墙。迷宫中有一些单元存放着钥匙, 并且所有的门被分成 P 类,
打开同一类的门的钥匙相同, 不同类门的钥匙不同。
大兵瑞恩被关押在迷宫的东南角,即(N, M)单元里, 并已经昏迷。 迷宫只有一个入口,
在西北角。 也就是说, 麦克可以直接进入(1, 1)单元。 另外,麦克从一个单元移动到另一个
相邻单元的时间为 1, 拿取所在单元的钥匙的时间以及用钥匙开门的时间可忽略不计。
´数据输入:
由文件 input.txt 提供输入数据。 第 1 行有 3 个整数,分别表示 N,M,P 的值。 第 2 行是 1
个整数 K, 表示迷宫中 门和墙的总 数。 第 I+2 行( 1<=I<=K),有 5 个整数, 依次为
Xi1,Yi1,Xi2,Yi2,Gi:
当 Gi>=1 时,表示(Xi1,Yi1)单元与(Xi2,Yi2)单元之间有一扇第 Gi 类的门, 当 Gi=0 时,
表示(Xi1,Yi1)单元与(Xi2,Yi2)单元之间有一堵不可逾越的墙(其中, |Xi1-Xi2|+|Yi1-Yi2|=1,
0<=Gi<=P)。
第 K+3 行是一个整数 S,表示迷宫中存放的钥匙总数。
第 K+3+J 行(1<=J<=S),有 3 个整数, 依次为 Xi1,Yi1,Qi: 表示第 J 把钥匙存放在(Xi1,Yi1)
单元里, 并且第 J 把钥匙是用来开启第 Qi 类门的。(其中 1<=Qi<=P)。
输入数据中同一行各相邻整数之间用一个空格分隔。
输入文件示例
input.txt
4 4 9
9
1 2 1 3 2
1 2 2 2 0
2 1 2 2 0
2 1 3 1 0
2 3 3 3 0
2 4 3 4 1
3 2 3 3 0
3 3 4 3 0
4 3 4 4 0
2
2 1 2
4 2 1输出文件示例
output.txt
14
【分析】
就是分层图最短路,钥匙状压加入状态点中。
然后路径长度都是1,所以每个点都只会算一次。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
#define Maxn 20 int a[Maxn][Maxn][],ky[Maxn][Maxn][];
int bx[]={,,,-,},
by[]={,,,,-};
int n,m,p,sk; void init()
{
scanf("%d%d%d",&n,&m,&p);
int sm;
scanf("%d",&sm);
memset(a,,sizeof(a));
for(int i=;i<=sm;i++)
{
int x1,y1,x2,y2,g;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&g);
if(g==) g=-;
for(int k=;k<=;k++) if(x1+bx[k]==x2&&y1+by[k]==y2)
{
a[x1][y1][k]=g;
a[x2][y2][-k]=g;
break;
}
}
scanf("%d",&sk);
memset(ky,,sizeof(ky));
for(int i=;i<=sk;i++)
{
int x,y,q;
scanf("%d%d%d",&x,&y,&q);
ky[x][y][++ky[x][y][]]=q;
}
} struct node
{
int x,y,s;
}; int dis[][][];
queue<node > q;
void spfa()
{
while(!q.empty()) q.pop();
memset(dis,-,sizeof(dis));
node ft;ft.x=;ft.y=;ft.s=;
q.push(ft);dis[][][]=;
int ans=-;
while(!q.empty())
{
node now=q.front();
int x=now.x,y=now.y,s=now.s;
for(int i=;i<=;i++) if(a[x][y][i]!=-&&x+bx[i]>=&&x+bx[i]<=n&&y+by[i]>=&&y+by[i]<=m)
{
int nx=x+bx[i],ny=y+by[i],ns=s;
if(a[x][y][i]!=&&((<<a[x][y][i]-)&s)==) continue;
// if(ky[nx][ny]) ns|=(1<<ky[nx][ny]-1);
for(int l=;l<=ky[nx][ny][];l++) ns|=(<<ky[nx][ny][l]-);
if(dis[nx][ny][ns]==-)
{
dis[nx][ny][ns]=dis[x][y][s]+;
if(nx==n&&ny==m) {ans=dis[nx][ny][ns];break;}
node tt;
tt.x=nx,tt.y=ny,tt.s=ns;
q.push(tt);
}
}
if(ans!=-) break;
q.pop();
}
printf("%d\n",ans);
} int main()
{
init();
spfa();
return ;
}

2016-11-06 14:33:08
【网络流24题】 No.14 孤岛营救问题 (分层图最短路)的更多相关文章
- luogu4011 孤岛营救问题 分层图
关键词:分层图 状态压缩 最短路径 分层图:现在要求从起点到终点的最优路线,但受到手里拿着哪些钥匙的影响,最优路线不单纯了.因此,决定一个节点.一条边的存在的数中应当增加一个手中拿有钥匙的状态.这样就 ...
- 【刷题】LOJ 6121 「网络流 24 题」孤岛营救问题
题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...
- loj #6121. 「网络流 24 题」孤岛营救问题
#6121. 「网络流 24 题」孤岛营救问题 题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂, ...
- cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法
14. [网络流24题] 搭配飞行员 ★★ 输入文件:flyer.in 输出文件:flyer.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有 ...
- Cogs 14. [网络流24题] 搭配飞行员
这道题其实蛮好想的,因为分为正,副飞行员.所以就把正飞行员当作Boy,副飞行员当作Girl.然后做Hungry即可. #include<bits/stdc++.h> using names ...
- Cogs 14. [网络流24题] 搭配飞行员(二分图匹配)
[网络流24题] 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有若干个来自各地的驾驶员,专门 ...
- 2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)
传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1和i2i_2i2,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1),(i2, ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
- 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
------------------------------------------------------------------------------------ 17/24 --------- ...
随机推荐
- JUnit4注解基本介绍
@After If you allocate external resources in a Before method you need to release them after the test ...
- Velocity 入门(一)
Velocity是一种Java模版引擎技术,该项目由Apache提出.因为非常好用,和工作中有啥用,所以我在在理简单的入门一下. 网上找了很多教程,写的不是很明白,要么就是全部拷贝下来时候运行不起来. ...
- Sun开发的JINI技术在网络中的应用
一.概述 Sun公司开发的Jini系统是一种创新技术,听说它的人很多但较少被人理解.Jini系统可利用Java扩展网络计算的范围,并有可能成为最佳解决方案. Jini是Sun公司的研究与开发项目,它能 ...
- Oracle SQL 基础学习
oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...
- python中关于正则表达式一
ab+,描述一个'a'和任意个'b',那么'ab','abb','abbbbb' 正则表达式可以:1.验证字符串是否符合指定特征,比如验证是否是合法的邮件地址 2.用来查找字符串,从一个长的文本中查找 ...
- C++编程注意事项
1.所有成员变量在构造函数中进行初始化操作,如指针赋值为空,bool赋值为FALSE(默认为TRUE); 2.构造函数与析构函数配对出现,执行反向操作,保证执行析构之后,没有遗留问题存在: 3.如果需 ...
- OC - 5.内存管理
一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...
- Apache配置命令
Apache的主配置文件: 1.DocumentRoot——指定网站的根目录 提示:该目录必须存在.目录上不能有汉字或空格. 2.DirectoryIndex (1)描述:设置网站的默认首页文件.访问 ...
- c#接口深入一步探究其作用,适合新人了解
前言 前一篇浅显的述说了一下c#接口的作用,并用了一个不怎么好的例子述说了一下.时隔一天,在看完大家的评论后我在论坛中查看了很多前辈们对c#接口的描述,发现大家对例子的说明不是太容易让我们这些新人理解 ...
- 在ARM Linux 使用 Valgrind
Linux valgrind 移植到ARM-Linux 一.Cross-Compile/交叉编译 (1)下载及解压Valgrind-3.11 (2)修改confirure 将armv7*)修改为ar ...