[solution] JZOJ 5459. 密室

Description

小X 正困在一个密室里,他希望尽快逃出密室。

密室中有$N$ 个房间,初始时,小X 在1 号房间,而出口在N 号房间。

密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条从房间$X$ 到房间$Y$ 的通道。另外,想要通过某个传送门,就必须具备一些种类的钥匙(每种钥匙都要有才能通过)。幸运的是,钥匙在打开传送门的封印后,并不会消失。

然而,通过密室的传送门需要耗费大量的时间,因此,小X 希望通过尽可能少的传送门到达出口,你能告诉小X 这个数值吗?

另外,小X 有可能不能逃出这个密室,如果是这样,请输出"No Solution"。

Input

第一行三个整数$N$,$M$,$K$,分别表示房间的数量、传送门的数量以及钥匙的种类数。

接下来$N$ 行,每行$K$ 个$0$ 或$1$,若第$i$ 个数为$1$,则表示该房间内有第$i$ 种钥匙,若第$i$ 个数为$0$,则表示该房间内没有第$i$ 种钥匙。

接下来$M$ 行,每行先读入两个整数$X$,$Y$,表示该传送门是建立在$X$ 号房间,通向$Y$ 号房间的,再读入$K$ 个$0$ 或$1$,若第$i$ 个数为$1$,则表示通过该传送门需要$i$ 种钥匙,若第$i$ 个数为$0$,则表示通过该传送门不需要第$i$ 种钥匙。

Output

输出一行一个“No Solution”,或一个整数,表示最少通过的传送门数。

Sample Input

3 3 2
1 0
0 1
0 0
1 3 1 1
1 2 1 0
2 3 1 1

Sample Output

2

Data Constraint

$n\leq5000,m\leq6000,k\leq10$




分割线




想法

最短路?BFS?

看到传送门,钥匙,还不消失,还有$k\leq10$,是不是感觉很亲切。对这里需要一个状压。

其实就是一个带状压的BFS

想到这里这个题就不难了,在正常BFS过程中加上状压代码和可行性判断(就是钥匙是否足够),OK成功AC掉这个题

Code

78ms,20.59MB

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,k;
int book[5003][1050];
struct Edge{
int s,t,nxt,w;
}edge[6003];
int head[5003],tot=0;
int ky[5003];
queue<pair<int,int> > q;
void add(){
int st,to,we=0;scanf("%d %d",&st,&to);
for(int i=1;i<=k;i++){int p;scanf("%d",&p);we*=2;we+=p;}
edge[tot].s=st;
edge[tot].t=to;
edge[tot].nxt=head[st];
edge[tot].w=we;
head[st]=tot;
tot++;
}
void bfs(){
q.push(make_pair(1,0));
book[1][0]=1;
while(!q.empty()){
int np=q.front().first,nw=q.front().second;
nw|=ky[np];
for(int i=head[np];i!=-1;i=edge[i].nxt)
if((int)(edge[i].w & nw)==edge[i].w)
if(book[edge[i].t][nw]==-1)
if(edge[i].t==n){
printf("%d\n",book[np][q.front().second]);return;
}
else{
q.push(make_pair(edge[i].t,nw));
book[edge[i].t][nw]=book[np][q.front().second]+1;
}
q.pop();
}
printf("No Solution\n");return;
}
void init(){
memset(book,-1,sizeof(book));
memset(ky,0,sizeof(ky));
memset(head,-1,sizeof(head));
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++){
int p;scanf("%d",&p);
ky[i]<<=1;
ky[i]|=p;
}
for(int i=1;i<=m;i++)
add();
}
int main(){
freopen("room.in","r",stdin);
freopen("room.out","w",stdout);
init();
bfs();
return 0;
}

[solution] JZOJ 5459. 密室的更多相关文章

  1. JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室

    5459. [NOIP2017提高A组冲刺11.7]密室 (File IO): input:room.in output:room.out Time Limits: 1000 ms  Memory L ...

  2. JZOJ 5459 购物

    Description X 城的商场中,有着琳琅满目的各种商品.一日,小X 带着小Y 前来购物,小Y 一共看中了n件商品,每一件商品价格为Pi.小X 现在手中共有m个单位的现金,以及k 张优惠券.小X ...

  3. [jzoj]3456.【NOIP2013模拟联考3】恭介的法则(rule)

    Link https://jzoj.net/senior/#main/show/3456 Description 终于,在众亲们的奋斗下,最终boss 恭介被关进了库特设计的密室.正当她们松了一口气时 ...

  4. 计蒜客 2017 NOIP 提高组模拟赛(四)Day1 T2 小X的密室

    https://nanti.jisuanke.com/t/17323 小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1号房间,而出口在 N号房间. 密室的每 ...

  5. 计蒜客NOIP模拟赛4 D1T2小X的密室

    小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...

  6. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  7. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  8. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  9. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

随机推荐

  1. sweetalert弹窗的使用

    之前接触到layer弹出层,今天又发现了一个非常实用的弹出层插件,它的名字叫做sweetalert. 官网地址:http://t4t5.github.io/sweetalert/ npm下载方式:np ...

  2. Node学习笔记(三)

    1.EventEmitter常用的API EventEmitter.on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数 listener. E ...

  3. JVM-字节码

  4. SHFileOperation 解决double-null terminated

    void rubyTools::funStrToWstr(string str, wstring& strw) { const char* pData = str.c_str(); int l ...

  5. 说下spring生命周期

    面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧     Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...

  6. vsCode关闭代码检查工具

    在script标签里,第一行输入下面的内容即可:

  7. 可以作为瘟到死(windows)路径的字符

    !#$%&""()+-0123456789;=@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz[]^_`{}~

  8. asp.net文件/大文件上传需要配置的项目整理

    HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 最可能的原因: •Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值. 可尝 ...

  9. Lua 和 C++ 交互

    step1.搭建好vs和lua相交互的环境: 1.下载一个lua5.3的源码: 2.有Lua_lib.lib这个文件: 3.开始配置: 鼠标放在工程名那: 右键选属性: 把包含目录点开进行编辑: 地址 ...

  10. DB2 公共表表达式(WITH语句的使用)

    ----start 说起WITH 语句,除了那些第一次听说WITH语句的人,大部分人都觉得它是用来做递归查询的.其实那只是它的一个用途而已,它的本名正如我们标题写的那样,叫做:公共表表达式(Commo ...