[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. BOUNDARIES AND SPACE

    BOUNDARIES AND SPACE Review Nice work! You've learned a lot. Let's review the web and CSS concepts c ...

  2. JavaScript: RegExp check UserName

    Function : We can use regular expressions to check user input data formats. Homework: Check user inp ...

  3. 《Spring_Four》第一次作业:团队亮相

    part one: 1.队名:Spring_Four 2.团队成员组成:学号/姓名(标记团队组长) 201571030114 李蕾 201571030143 周甜甜 201571030139 张天旭( ...

  4. c++冒号作用

    转自http://www.360doc.com/content/13/0605/11/3373961_290615318.shtml 1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bi ...

  5. Mesh属性[Unity]

    Mesh属性[Unity] Mesh是Unity内的一个组件,称为网格组件.3D网格是Unity中最重要的图形元素.在Unity中存在多种组件用于渲染标准网格或者蒙皮网格.拖尾或者3D线条. 在Uni ...

  6. svg矢量图

    svg简介 Scalable Vector Graphics 可缩放矢量图形 SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失 svg知识点 svg如何绘图 svg和cnavas区别 svg ...

  7. 一些hue的参考网址

    CDH5.8 HUE的使用(那些年走过的坑) https://blog.csdn.net/gao123456789amy/article/details/79242713 HUE的时间问题等 http ...

  8. Windows驱动开发调试工具

    [开发工具] VS2012 [调试工具] Windbg:和VM配合实现双机联合调试,完成双机调试功能,可以结合<软件调试>这本书对Windbg有较为深入的认识. DebugView: 可以 ...

  9. 【VBA】セールの最初起動時、VBAを自動的に実行方法

    方法一 セールの「ThisWorkbook」にて.「Workbook」の「Open」関数にて.ロジックを追加する Private Sub Workbook_Open() Msgbox "He ...

  10. 给对话框添加动画 Dialog

    先添加一个动画文件(res->anim文件夹中),文件名为a.xml <?xml version="1.0" encoding="utf-8"?&g ...