【题意】

  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 孤岛营救问题 (分层图最短路)的更多相关文章

  1. luogu4011 孤岛营救问题 分层图

    关键词:分层图 状态压缩 最短路径 分层图:现在要求从起点到终点的最优路线,但受到手里拿着哪些钥匙的影响,最优路线不单纯了.因此,决定一个节点.一条边的存在的数中应当增加一个手中拿有钥匙的状态.这样就 ...

  2. 【刷题】LOJ 6121 「网络流 24 题」孤岛营救问题

    题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...

  3. loj #6121. 「网络流 24 题」孤岛营救问题

    #6121. 「网络流 24 题」孤岛营救问题   题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂, ...

  4. cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法

    14. [网络流24题] 搭配飞行员 ★★   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队有 ...

  5. Cogs 14. [网络流24题] 搭配飞行员

    这道题其实蛮好想的,因为分为正,副飞行员.所以就把正飞行员当作Boy,副飞行员当作Girl.然后做Hungry即可. #include<bits/stdc++.h> using names ...

  6. Cogs 14. [网络流24题] 搭配飞行员(二分图匹配)

    [网络流24题] 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有若干个来自各地的驾驶员,专门 ...

  7. 2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)

    传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1​和i2i_2i2​,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1​),(i2​, ...

  8. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  9. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

随机推荐

  1. JVM笔记3:Java垃圾收集算法与垃圾收集器

    当前商业虚拟机的垃圾收集都采用"分代收集"算法,即根据对象生命周期的不同,将内存划分几块,一般为新生代和老年代,不同的代根据其特点使用最合适的垃圾收集算法 一,标记-清除算法: 该 ...

  2. ffmpeg之yuv2rgb_c_24_rgb

    YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, ) LOADCHROMA(); PUTRGB24(dst_1, py_1, ); PUTRGB24(dst_2, py_2 ...

  3. Topself

    TopShelf简介 个人理解:开源.跨平台的服务框架.提供一种方式以控制台编写windows服务,与windows服务相比,目前只发现便于调试. 官网网站:http://docs.topshelf- ...

  4. Unity3D 之UGUI 切换开关(toggle)

    (toggle)开关能够实现通过点击实现开和关. 开关下面有两个游戏元素,一个是背景,一个是文字,背景是开关按钮的背景. 可以通过 Is ON开控制开关的开与关. Group -->分组,能够实 ...

  5. jQuery对象和Dom对象的区分以及之间转换

    刚开始学习jQuery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象.至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换. 一,什么是jQuer ...

  6. 类库探源——System.Math 和 Random

    一.System.Math Math类:为三角函数.对数函数和其他通用数学函数提供常数和静态方法 命名空间: System 程序集 :   mscorlib.dll 继承关系: 常用属性: Math. ...

  7. js 实现图片旋转角度

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 关于网页强制被跳转到wpkg.org的解决

    今天登陆MIT的网站看一篇文章,在进入到页面的时候,网页就会自动跳转到wpkg.org这个网页,查了下据说是DNS被污染了,暂时还是不是很清楚,先把问题解决了. 方法: 在C:\WINDOWS\sys ...

  9. (转 部分修改) IOS 手势密码(简单版)

    // // Created by wangtouwang on 15/4/7. // Copyright (c) 2015年 wangtouwang. All rights reserved. // ...

  10. java中移位运算符:<<、>>和>>>之间的比较

    一.说明 <<:运算符将二进制位进行左移操作 >>:运算符将二进制位进行右移操作 >>>:运算符将用0填空高位 二.举例 /** * *----------c ...