[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. Java 基础测试题

    一.选择题 1.下面哪些是合法的变量名? ( DEG  ) A.2variable B. .variable2 C. ._whatavariable D._3_ E.$anothervar F.#my ...

  2. background-size的应用情景:当给出的背景图片大于实际网页需要布局的图片大小时

    网页需求是:50*50 如果只设置  width:50px;height:50px;background-image("images/XXX.png"); 效果如下: 添加设置:b ...

  3. Django文件存储(一)默认存储系统

    Django默认使用的文件存储系统'django.core.files.storage.FileSystemStorage'是一个本地存储系统,由settings中的DEFAULT_FILE_STOR ...

  4. Java Day26进程01天

    Java开启多个线程有两种方法,一种继承Thread类,一种实现Runnable接口.具体示例如下: 01继承Thread类 02实现Runnable接口

  5. 31_NavLink组件包装优化

    简单理解为自定义一个组件并自带样式 import React, {Component} from 'react' import {Switch, Route, Redirect} from 'reac ...

  6. MongoError: no primary found in replicaset

    nodejs连接mongodb时,使用集群方式报错 2017-09-22T01:42:32.115Z - error: db connect failed 2017-09-22T01:42:32.12 ...

  7. rpm包安装的nginx热升级

    文章目录一.本地环境基本介绍二.yum升级命令说明三.升级好nginx后如何不中断业务切换3.1.nginx相关的信号说明3.2.在线热升级nginx可执行文件程序一.本地环境基本介绍本次测试环境,是 ...

  8. 220. Contains Duplicate III 数组指针差k数值差t

    [抄题]: Given an array of integers, find out whether there are two distinct indices i and j in the arr ...

  9. Mobile Computing: the Next Decade论文 cloudlet薄云

    1 Introduction “Information at your fingertips anywhere, anytime” has been the driving vision of mob ...

  10. mysql解压缩版安装方法以及mysql无法启动1067错误

    https://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html我下载的版本号是5.6.421.解压到C:\Program Files\M ...