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

小 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,则表示通过该传送门不需要第 iii 种钥匙。

输出格式

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

数据规模与约定

样例输入1

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

样例输出1

2

样例输入2

20 40 0
10 18
18 14
19 13
4 14
13 10
5 18
14 1
13 13
10 16
19 11
11 15
10 18
5 8
12 19
7 8
18 6
14 5
9 5
2 17
13 14
18 15
8 18
7 1
13 5
4 6
17 4
1 4
10 10
13 8
19 2
4 9
3 3
5 10
17 5
12 8
19 11
3 16
17 10
18 16
13 13 

样例输出2

No Solution

样例输入3

20 50 0
8 10
7 17
5 11
14 20
20 16
8 19
12 11
18 7
17 5
4 15
16 11
11 8
10 12
8 9
16 8
3 16
1 6
3 20
6 10
11 12
6 8
18 17
14 17
3 11
4 19
9 2
8 6
13 2
5 2
12 19
8 10
14 7
6 12
6 4
13 2
8 7
13 19
17 9
3 14
18 20
2 14
4 17
20 15
14 15
2 15
7 20
12 12
18 10
15 9
15 9 

样例输出3

4

裸的搜索把钥匙的状态压缩为二进制数x<1024判断能否传送?边权为需要钥匙的状态dis&x==dis那么就可以传送
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 struct Node
 8 {
 9     int next,to,dis;
10 }edge[50001];
11 struct zt
12 {
13     int x,t;
14 };
15 int num,head[5001];
16 int dist[5001][1501],key[5001],n,k,m;
17 bool vis[5001][1501];
18 void add(int u,int v,int dis)
19 {
20     num++;
21     edge[num].next=head[u];
22     head[u]=num;
23     edge[num].to=v;
24     edge[num].dis=dis;
25 }
26 void SPFA()
27 {int i;
28     queue<zt> Q;
29     memset(dist,127/3,sizeof(dist));
30     Q.push((zt){1,key[1]});
31     dist[1][key[1]]=0;
32    while (Q.empty()==0)
33     {
34        zt u=Q.front();
35        Q.pop();
36        vis[u.x][u.t]=0;
37          for (i=head[u.x];i;i=edge[i].next)
38          {
39              int v=edge[i].to;
40              if ((edge[i].dis&u.t)==edge[i].dis&&dist[v][u.t|key[v]]>dist[u.x][u.t]+1)
41              {
42                  dist[v][u.t|key[v]]=dist[u.x][u.t]+1;
43                  if (v==n)
44                  {
45                      cout<<dist[v][u.t|key[v]];
46                      return;
47                  }
48                  if (vis[v][u.t|key[v]]==0)
49                  {
50                      vis[v][u.t|key[v]]=1;
51                      Q.push((zt){v,u.t|key[v]});
52                  }
53              }
54          }
55     }
56     cout<<"No Solution";
57     return;
58 }
59 int main()
60 {int i,j,x,l,r;
61     cin>>n>>m>>k;
62     for (i=1;i<=n;i++)
63     {
64         for (j=1;j<=k;j++)
65         {scanf("%d",&x);
66             if (x) key[i]|=(1<<j-1);
67         }
68     }
69     for (i=1;i<=m;i++)
70     {
71         scanf("%d%d",&l,&r);
72         int dis=0;
73         for (j=1;j<=k;j++)
74         {scanf("%d",&x);
75             if (x) dis|=(1<<j-1);
76         }
77         add(l,r,dis);
78     }
79     SPFA();
80 }
时间: 2024-10-10 14:29:45

计蒜客NOIP模拟赛4 D1T2小X的密室的相关文章

计蒜客NOIP模拟赛(3) D1T2 信息传递

一个数据包在一个无向网络中传递.在时刻0,该数据包将依照特定的概率随机抵达网络中的某个节点.网络可以看做一张完全带权无向图,包含N个节点,若t时刻数据包在节点i,则在t+1时刻,数据包被传递到节点j的概率是 d(i,j)/(∑kd(i,k))其中d(i,j)表示节点i到节点j的最短路径的长度.在传递到下一个节点后,该数据包会自动删除在当前节点的备份.现在,给定数据包0时刻在每个节点的概率和网络的每条边权.求T时刻数据包在每个节点的概率.输入格式第一行两个整数N和T.第二行N个实数,表示0时刻数据

计蒜客NOIP模拟赛4 D1T3 小X的佛光

小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X 城时只建造 N – 1 条边,使得城市的各个地点能够相互到达. 小 X 计划蒸发 Q 天的学水,每一天会有一名学水从 A 地走到 B 地,并在沿途各个地点留下一个水塘.此后,小 X 会从 C 地走到 B 地,并用佛光蒸发沿途的水塘.由于 X 城是一个学佛横行的城市,学水留下的水塘即使没有被小 X 蒸

[计蒜客NOIP模拟赛]2017.7.28Day1回顾反思总结

D1T1 打地鼠 题目链接 反思- 比赛得分-0 思考: 比赛时,以为T1是一道常规模拟题目,没怎么看数据范围.直接手动模拟,模拟完之后太自信也没有造数据Hack自己的程序.直接导致爆0.同时发现自己对二维前缀和的学习也只是在皮毛之上,没有深入思考与理解. 解题思路- 将图像旋转45°之后用二维前缀和维护,每次O(1)查询,时间复杂度O(N*N). 但是目前觉得这个图像旋转45°难以理解,打算手动模拟加深理解. 标程 #include<bits/stdc++.h> using namespac

计蒜客NOIP模拟赛4 D2T1 鬼脚图

鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线,且 在同一高度只会有一条横线. 在图的上方,我们将这 n 条竖线依次标号为 1 到 n.以数字 3 为例,它会沿着所在的竖线下降,期间如果 遇到横线就会移动到横线的另一端,最终降落至下面的第一条竖线.上图中还标出了另外几种数字的最终位置.奇特的是,开始时每条竖线上都有一个数字,而 最终每条竖线下还是

计蒜客NOIP模拟赛(3)D1T3 任性的国王

X 国的地图可以被看作一个两行 nn 列的网格状图.现在 X 国需要修建铁路,然而该国的国王非常小气,他只想保证位于某两列之间的所有城市互相可以到达就行了,在此基础上,他希望所花费的代价最小. 铁路可以建在任何两个相邻的点之间,使他们可以互相到达.可以作为工作人员,你已经整理出了为每一对相邻城市架设铁路所需要的花费.你需要准备好回答国王如下形式的问题. 对于 (i,j)(i,j):当前情况下,使第 ii 列到第 jj 列之间的所有城市连通的最小代价是多少(列下标从 11 开始)?注意不能用其他列

计蒜客NOIP模拟赛D2T3 数三角形

刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张图的多样性进行打分.一张图的多样性取决于它的同色和异色三角形的个数.具体来说,G 中每有一个三边颜色都互不同的三角形(异色三角形)可以得 3 分,每有一个三边颜色都相同的三角形(同色三角形)则要被扣掉 6 分,其它三角形不得分也不扣分. 现在,请你写一个程序来计算 G 的多样性分数.输入格式 第一行两个正整数 n 和

计蒜客NOIP模拟赛4 D2T2 跑步爱天天

YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为根的有根树,初始每个点都有个警卫,每个警卫会按深度优先的顺序周期性的巡逻以其初始点为根的子树(详见样例解释),一个时刻走且仅走一条边. YOUSIKI 初始在 x 点,他要到根结点拜访皮皮妖,他会沿着最短路径走,一个时刻走且仅走一条边,当他走到这个点时,如果遇到了警卫,他会消耗 1点妖气将这个警卫杀死,杀死后

复习---归并排序求逆序对--计蒜客2017noip模拟赛二--蒜头君的排序

题目链接:https://nanti.jisuanke.com/t/16443 我不会矩阵快速幂,所以只拿了60分, 发现归并排序掌握的并不熟练,借此良机复习一下. 重在归并排序分治思想,要牢记! #include<iostream> #include<cstring> using namespace std; int n,m,a[30005],s[30005],ans,d[30005]; void msort(int l,int r) { if(l==r)return;//如果只

计蒜课 八月模拟赛题解

看见机房有大佬上周写了上面的普及信心赛 于是我康了康 8月的提高组模拟赛 9月的还没开始qwq 真的 有点难 主要是我先打开了T2 我再次 对自己的数学产生了怀疑 我现在还是不会写T2 T1 又又又又都错题了 下次重建图 尽量写vector 都写 邻接表 变量差不多的容易搞混 我这个同学变又写错了 T1 :https://nanti.jisuanke.com/t/41086 题目大意就是 一个有向图 删一个点 把与他直接和间接 相连的点 删掉 然后 求删掉所有点的最小最大代价 : 为了避免这个环