题目描述

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

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

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

输入格式

第一行有三个整数,分别表示 \(n,m,p\) 的值。

第二行是一个整数 \(k\) ,表示迷宫中门和墙的总数。

第 \(i+2\) 行 \((1 \leq i \leq k )\) ,有 \(5\) 个整数,依次为 \(x _{i1},y_{i1},x_{i2},y_{i2},g_i\) :当 \(g_i \geq1\) 时,表示 \((x_{i1},y_{i1})\) 单元与 \((x_{i2},y_{i2})\) 单元之间有一扇第 \(g_i\) 类的门,当 \(g_i = 0\) 时, 表示 \((x_{i1},y_{i1})\) 单元与 \((x_{i2},y_{i2})\) 单元之间有一堵不可逾越的墙。

第 \(k+3\) 行是一个整数 \(s\),表示迷宫中存放的钥匙总数。

第 \(k+3+j\) 行 \((1 \leq j \leq s)\) ,有 \(3\) 个整数,依次为 \(x_{i1},y_{i1},q_i\) ,表示第 \(j\) 把钥匙存放在 \((x_{i1},y_{i1})\) 单元里,并且第 \(j\) 把钥匙是用来开启第 \(q_i\) 类门。

输入数据中同一行各相邻整数之间用一个空格分隔。

输出格式

输出麦克营救到大兵瑞恩的最短时间。如果问题无解,则输出 \(-1\)。

样例

样例输入

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

样例输出

14

数据范围与提示

  • \(|x_{i1}-x_{i2}|+|y_{i1}-y_{i2}|=1, 0 \leq g_i \leq p\)

  • \(1\leq q_i \leq p\)

  • \(n,m,p \leq 10,\ k < 150\)

题解

又是一道不是网络流的网络流24题之一

状压钥匙的状态后类似SPFA跑最短路就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100+10,inf=0x3f3f3f3f;
int n,m,p,k,s,G[MAXN][MAXN],d[MAXN][1<<11],vis[MAXN][1<<11],dr[4][2]={{0,1},{1,0},{-1,0},{0,-1}},key[MAXN];
struct node{
int x,y,k;
};
std::queue<node> q;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline int id(int x,int y)
{
return (x-1)*m+y;
}
inline void SPFA()
{
memset(d,inf,sizeof(d));
d[id(1,1)][key[id(1,1)]]=0;
vis[id(1,1)][key[id(1,1)]]=1;
q.push((node){1,1,key[id(1,1)]});
while(!q.empty())
{
node pr=q.front();
q.pop();
int x=pr.x,y=pr.y,now=pr.k;
vis[id(x,y)][now]=0;
for(register int i=0;i<4;++i)
{
int dx=x+dr[i][0],dy=y+dr[i][1];
if(dx<1||dx>n||dy<1||dy>m)continue;
if(G[id(x,y)][id(dx,dy)]==-1||(now&(1<<G[id(x,y)][id(dx,dy)])))
{
int nxt=now|key[id(dx,dy)];
if(d[id(dx,dy)][nxt]>d[id(x,y)][now]+1)
{
d[id(dx,dy)][nxt]=d[id(x,y)][now]+1;
if(!vis[id(dx,dy)][nxt])vis[id(dx,dy)][nxt]=1,q.push((node){dx,dy,nxt});
}
}
}
}
}
int main()
{
read(n);read(m);read(p);
read(k);
memset(G,-1,sizeof(G));
for(register int i=1;i<=k;++i)
{
int x1,y1,x2,y2,g;read(x1);read(y1);read(x2);read(y2);read(g);
G[id(x1,y1)][id(x2,y2)]=G[id(x2,y2)][id(x1,y1)]=g;
}
read(s);
for(register int i=1;i<=s;++i)
{
int x,y,q;read(x);read(y);read(q);
key[id(x,y)]|=1<<q;
}
SPFA();
int ans=inf;
for(register int i=0;i<(1<<p+1);++i)chkmin(ans,d[id(n,m)][i]);
write(ans==inf?-1:ans,'\n');
return 0;
}

【刷题】LOJ 6121 「网络流 24 题」孤岛营救问题的更多相关文章

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

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

  2. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

  3. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

  4. [LOJ#6002]「网络流 24 题」最小路径覆盖

    [LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是  ...

  5. loj #6014. 「网络流 24 题」最长 k 可重区间集

    #6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...

  6. loj #6013. 「网络流 24 题」负载平衡

    #6013. 「网络流 24 题」负载平衡 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时 ...

  7. loj #6122. 「网络流 24 题」航空路线问题

    #6122. 「网络流 24 题」航空路线问题 题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单 ...

  8. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题   题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...

  9. [loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

    #6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...

随机推荐

  1. 开启Node.js的大门

    其实也没什么好说的,简而言之,就是如何配置node.js环境,然后进行开发.博主最近比较堕落,觉得什么事情也没有就不知道想干什么,想融入一些事情又觉得没大神指引,于是自娱自乐开始自己玩node.js, ...

  2. 20155232《网络对抗》Exp2 后门原理与实践

    20155232<网络对抗>Exp2 后门原理与实践 问题回答 1.例举你能想到的一个后门进入到你系统中的可能方式? 通过网页上弹出来的软件自动安装 2.例举你知道的后门如何启动起来(wi ...

  3. 20155320《网络对抗》Exp4 恶意代码分析

    20155320<网络对抗>Exp4 恶意代码分析 [系统运行监控] 使用schtasks指令监控系统运行 首先在C盘目录下建立一个netstatlog.bat文件(由于是系统盘,所以从别 ...

  4. 20155327 李百乾 Exp7 网络欺诈防范

    20155327 李百乾 Exp7 网络欺诈防范 基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 就此次试验来看,被收到NDSspoof攻击,首先要被攻击机扫描,并被设置为目标,所 ...

  5. 20155331 Exp3 免杀原理与实践

    20155331 Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 1.基于特征码的检测,2.启发式恶意软件检测,3.基于行为的恶意软件检测. 免杀是做什么? 让病毒不被杀毒软件杀 ...

  6. Unused Method(不再使用的方法)——Dead Code(死亡代码)

        系列文章目录:     使用Fortify进行代码静态分析(系列文章) Unused Method(不再使用的方法)    示例:  private bool checkLevel(strin ...

  7. [Deep-Learning-with-Python]基于Kears的Reuters新闻分类

    Reuters数据集下载速度慢,可以在我的repo库中找到下载,下载后放到~/.keras/datasets/目录下,即可正常运行. 构建神经网络将路透社新闻分类,一共有46个类别.因为有多个类别,属 ...

  8. gulp.src()内部实现探究

    写在前面 本来是想写个如何编写gulp插件的科普文的,突然探究欲又发作了,于是就有了这篇东西...翻了下源码看了下gulp.src()的实现,不禁由衷感慨:肿么这么复杂... 进入正题 首先我们看下g ...

  9. WEB返回顶部效果

    1. PC端页面返回顶部效果 1 $( window ).scroll(function(){ 2 if( $( window ).scrollTop() > 500 ){ // 当顶部的滚动距 ...

  10. 吴恩达《AI For Everyone》_练习英语翻译_待更新

    AI For Everyone https://www.coursera.org/learn/ai-for-everyone 讲师: Andrew Ng (吴恩达) CEO/Founder Landi ...