计蒜客 2017 NOIP 提高组模拟赛(四)Day1 T2 小X的密室
https://nanti.jisuanke.com/t/17323
小 X 正困在一个密室里,他希望尽快逃出密室。
密室中有 N 个房间,初始时,小 X 在 1号房间,而出口在 N号房间。
密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条从房间 X 到房间 Y 的通道。另外,想要通过某个传送门,就必须具备一些种类的钥匙(每种钥匙都要有才能通过)。幸运的是,钥匙在打开传送门的封印后,并不会消失。
然而,通过密室的传送门需要耗费大量的时间,因此,小 X 希望通过尽可能少的传送门到达出口,你能告诉小 X 这个数值吗?
另外,小 X 有可能不能逃出这个密室,如果是这样,请输出 "No Solution"。
输入格式
第一行三个整数 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种钥匙。
输出格式
输出一行一个 "No Solution",或一个整数,表示最少通过的传送门数。

思路:
一道很有意思的搜索题,如果没有钥匙存在的话,那么这道题就变成一道纯粹的搜索题了。
在有钥匙存在的情况下,那么思考用什么来表示钥匙的状态最为方便。。。那显然是二进制了,每一次钥匙状态的判断可以用与运算解决,钥匙的传递可以用或运算解决,非常方便而且复杂度极低。
具体看代码以及最后一组测试点没有过(大雾
代码:
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
];
];
];
int n,m,k;
struct edge
{
int from,to;
int cost;
};
vector<edge> edges;
vector<];
void adde(int from,edge tmp)
{
edges.push_back(tmp);
int m = edges.size();
v[);
}
void bfs1(void)
{
vis[] = ;
queue<int> q;
q.push();
;
while (!q.empty())
{
int s = q.front();q.pop();
;i < v[s].size();i++)
{
int j = v[s][i];
int to = edges[j].to;
if (vis[to]) continue;
vis[to] = ;
dis[to] = dis[s] + ;
q.push(to);
if (to == n)
{
f = ;
break;
}
}
if (f) break;
}
}
void bfs2()
{
vis[] = ;
queue<int> q;
q.push();
;
while (!q.empty())
{
int s = q.front();q.pop();
;i < v[s].size();i++)
{
int j = v[s][i];
int to = edges[j].to;
int w = edges[j].cost;
if (vis[to]) continue;
if ((key[s] & w) < w) continue;
key[to] |= w;
key[to] |= key[s];
vis[to] = ;
dis[to] = dis[s] + ;
q.push(to);
if (to == n)
{
f = ;
break;
}
}
if (f) break;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
if (!k)
{
;i < m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
edge tmp = (edge){x,y,};
adde(x,tmp);
}
bfs1();
if (!vis[n]) printf("No Solution\n");
else printf("%d\n",dis[n]);
}
else
{
;i <= n;i++)
{
;
;j <= k;j++)
{
int x;
scanf("%d",&x);
<< j);
}
key[i] = tmp;
}
;i <= m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
;
;j <= k;j++)
{
int x;
scanf("%d",&x);
<< j);
}
edge e = (edge){x,y,tmp};
adde(x,e);
}
bfs2();
if (!vis[n]) printf("No Solution\n");
else printf("%d\n",dis[n]);
}
;
}
计蒜客 2017 NOIP 提高组模拟赛(四)Day1 T2 小X的密室的更多相关文章
- 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]
T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...
- 10-18 noip提高组模拟赛(codecomb)T2贪心
T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...
- HGOI20180815 (NOIP 提高组模拟赛 day2)
Day 2 rank 11 100+35+30=165 本题是一道数论题,求ax+by=c的正整数对(x,y) x>=0并且y>=0 先说下gcd: 求a,b公约数gcd(a,b) 如gc ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】
U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...
- noip提高组模拟赛(QBXT)T2
T2count题解 [ 问题描述]: 小 A 是一名热衷于优化各种算法的 OIER,有一天他给了你一个随机生成的 1~n 的排列, 并定 义区间[l,r]的价值为: \[ \huge C_{l,r}= ...
- [LUOGU] NOIP提高组模拟赛Day1
题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...
- l洛谷 NOIP提高组模拟赛 Day2
传送门 ## T1 区间修改+单点查询.差分树状数组. #include<iostream> #include<cstdio> #include<cstring> ...
- HGOI2010816 (NOIP 提高组模拟赛 day1)
Day1 210pts(含T1莫名的-10pts和T3莫名的-30pts) 100+70+40=210 rank 29 这道题第一眼看是字符串匹配问题什么KMP啊,又想KMP不会做啊,那就RK Has ...
随机推荐
- ios 初体验<UIButton 控件>
1.创建UIButton 跟其他方式不同,不是直接alloc,init 创建 用工厂化方式创建 UIButton *sureBtn = [UIButton buttonWithType:UIButto ...
- java开发3轮技术面+hr面 面经(MT)
一直没打理博客园 发现博客园阅读量好大,就把前段时间写的一个面经也搬过来咯,大家一起加油.... 作者:小仇Eleven 链接:https://www.nowcoder.com/discuss/37 ...
- Maven(一)初识Maven
前言 在这之前一直都有去看关于Maven的相关介绍,但是没有到真正要用的时候,自己总是以为懂了.其实真的感觉Maven并没有想象的那么简单! 那我们该怎么去学习maven呢?接下来我将从: 初步认识m ...
- 汇编指令-位置无关码(BL)与绝对位置码(LDR)(2)
位置无关码,即该段代码无论放在内存的哪个地址,都能正确运行.究其原因,是因为代码里没有使用绝对地址,都是相对地址. 位置相关码,即它的地址与代码处于的位置相关,是绝对地址 BL :带链接分支跳转指令 ...
- java伪代码《大道至简》
阅读<大道至简>第一章,深感作者对编程问题的精炼定义,通过对古老寓言故事<愚公移山>的引用,说明了编程的本质,即顺序,分支,循环.其中又将他们扮演的项目组织者,团队经理,编程人 ...
- 集美大学网络1413第十五次作业成绩(团队十) -- 项目复审与事后分析(Beta版本)
题目 团队作业10--项目复审与事后分析(Beta版本) 团队作业10成绩 --团队作业10-1 Beta事后诸葛亮 团队/分值 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色 ...
- JAVA基础第六组(5道题)
26.[程序26] 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母. 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句 ...
- 蓝桥杯PREV-11:横向打印二叉树
嗯,没错我还报了蓝桥杯. 这是题目 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放 ...
- 201521123114 《Java程序设计》第7周学习总结
1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 Q1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 public b ...
- 201521123045 《Java程序设计》第2周学习总结
---恢复内容开始--- #1. 本周学习总结 上课讲解了上次的实验题目,对其中题目的一些问题得到了解决.学会了java数组的使用,对如何使用码云上传代码有了更清晰的理解.pta还是有一些问题没有解决 ...