JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室
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
Solution
看到 k≤10k\leq10 ,就想到状压DP——二进制状态!
于是考虑从起点开始做一遍SPFA,用一个二维状态存即可(位置和状态)。
但由于边权为 1 ,没有松弛操作,所以只需 BFS 一遍,输出终点答案即可。
Code
#include<cstdio>
#include<cstring>
using namespace std;
const int N=6001;
struct data
{int x,y;
}q[N*1000];
int tot,ans=1e9;
int first[N],next[N],en[N],w[N];
int a[N],dis[N][1025];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void insert(int x,int y,int z)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;w[tot]=z;
}
int main()
{int n=read(),m=read(),k=read();for(int i=1;i<=n;i++)for(int j=0;j<k;j++) a[i]+=read()<<j;for(int i=1;i<=m;i++){int x=read(),y=read(),z=0;for(int j=0;j<k;j++) z+=read()<<j;insert(x,y,z);}memset(dis,60,sizeof(dis));int l=dis[1][a[1]]=0,r=1;q[1].x=1,q[1].y=a[1];while(l<r){data now=q[++l],t;for(int i=first[now.x];i;i=next[i])if((now.y&w[i])==w[i] && dis[now.x][now.y]+1<dis[en[i]][now.y|a[en[i]]]){dis[en[i]][now.y|a[en[i]]]=dis[now.x][now.y]+1;if(en[i]==n) ans=min(ans,dis[en[i]][now.y|a[en[i]]]);t.x=en[i],t.y=now.y|a[en[i]];q[++r]=t;}}if(ans==1e9) puts("No Solution"); else printf("%d",ans);return 0;
}
JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室相关推荐
- JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列
Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...
- JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数
Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...
- JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线
Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...
- JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格
Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...
- JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏
Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...
- JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章
Description nodgd写了一篇文章,自认为这是一篇好文章.nodgd的文章由n个小写英文字母组成.文章的一个子串指的是文章中的一段连续的字母,子串的长度就是这一段的字母个数.nodgd在文 ...
- JZOJ 5463. 【NOIP2017提高A组冲刺11.8】证书
Description Pulumi生活在P城的角落,而他的朋友们gjdy,oyski,tutuwai等等生活在P城的靠中心位置. P城很大,但它拥有优秀的城市结构,同时P城重视文化教育的发展,P城共 ...
- JZOJ 5460. 【NOIP2017提高A组冲刺11.7】士兵训练
Description Input 第一行两个数n,q 表示士兵数以及阅兵次数. 接下来一行n-1 个整数,第i 个整数表示士兵i+1 的直属教官. 接下来n 行每行两个整数i i b ,l 描述一位 ...
- JZOJ 5454. 【NOIP2017提高A组冲刺11.5】仔细的检查
Description nodgd家里种了一棵树,有一天nodgd比较无聊,就把这棵树画在了一张纸上.另一天nodgd更无聊,就又画了一张. 这时nodgd发现,两次画的顺序是不一样的,这就导致了原本 ...
最新文章
- Spark+hadoop+mllib及相关概念与操作笔记
- 支付宝支付 - 异步通知与同步通知
- Android 测试支持库 1.0 现已发布!
- python自动点击网页按钮_Python+Selenium使用(二)- 自动点击下一页
- C# 监控字段_有哪些好的C#开源项目推荐?
- css的属性是变量是怎么表达,CSS自定义变量属性——像less,sass那样在css中使用变量(译)...
- 计算机网络第五章课后答案第七版(谢希仁著)
- 目标检测论文综述(一)深度卷积神经网络
- roc_curve()的用法及用途
- getBytes方法
- 在Windows 10 64 位机器上安装Debug
- 星际争霸 vs 魔兽争霸3 vs 红警完全对比
- Cacti之交换机端口无法正常显示
- 差异表达基因热图怎么看_基因表达谱热图绘制
- 工程伦理 清华慕课网答案
- Apollo入门使用手册
- 目标检测——小目标检测问题
- c盘空间不足怎么清理(电脑磁盘空间不足怎么清理)
- APP流量变现的“快车”,你坐上了吗?
- 兽医提醒:狗狗生病的9个征兆,建议铲屎官收藏,以备不时之需!
热门文章
- C#字节数组与值类型变量的互相转换,以及注意事项
- oracle 一行转多行,oracle 一行变多行
- win10下gnuplot的安装
- [云炬创业管理笔记]第九章为创业成败而准备测试1
- 科大星云诗社动态20210526
- oracle aced什么资质,ACOUG 中国行—暨Oracle WDP云数据之旅,火热报名中……
- SiamMask:视频跟踪最高精度 (中科院王强大神作品)
- 转换到 COFF 期间失败: 文件无效或损坏
- 一碗面,害了一个孩子,却惊醒了中国无数父母!
- Delphi与c++ 数据类型对照表(从万一的博客园摘录)