时间限制:1000MS  内存限制:65535K
提交次数:12 通过次数:9

收入:32

题型: 编程题   语言: C++;C

Description

现在正是期末,在复习离散数学的Acmer遇到了问题,你能帮助他吗?
Acmer正在复习的是推理,不过他的推理系统可能与别人的不一样。
(所以说他是一个伪Acmer~。做完这题,请自觉把这里伪Acmer自己定义的概念忘了。。否则到时学离散的时候混淆了概念的话自重。。。)
他的推理系统定义如下:
1.用大写英文字母A-Z表示一个命题。
2.用A→B表示若命题A成立则命题B成立。
3.用A↔B表示A→B且B→A。
(这里2,3皆表示一种逻辑关系。)
推理就是由若干个命题或逻辑关系出发,推出新的命题或逻辑关系。
如,已知A→B和B→C,我们可以推出A→C。
又如,已知A→B和A,我们可以推出B。
再如,如果仅有A、B成立,是不可以推出A→B的。
。。。。。。
现在Acmer已经知道了n个命题或逻辑关系是成立的。而且,他从这些前提出发,又推出了m个新的命题或逻辑关系出来。
不过,他的推理过程并不一定正确。所以,你能告诉他这m个结论中哪些是正确的,哪些是错误的吗?

输入格式

单case输入。
第一行是一个整数n(0<=n<=100)。
接下来n行,每行表示1个已知成立的命题或逻辑关系。
每行首先是一个数字x(1<=x<=3),
  若是1,后面接一个大写英文字母,表示一个命题。
  若是2,后面接两个大写英文字母,表示逻辑关系→。
  若是3,后面接两个大写英文字母,表示逻辑关系↔。
接着是一个整数m(0 < m <= 100)。
接下来m行,每行表示1个要求判断正误的命题或逻辑关系。
每行的格式同上。

输出格式

输出m行。对每个要你判断的结论,正确的话输出“yes”,否则输出“no”。

输入样例

Sample#1:
2
2 A B
2 B C
1
2 A C Sample#2:
1
2 A B
1
1 B Sample#3:
2
2 A B
1 A
1
1 B

输出样例

Sample#1:
yes Sample#2:
no Sample#3:
yes

提示

Sample#不是输入输出的一部分。
注意区别命题和逻辑关系成立的不同。 思路:直接dfs暴力搜一遍,被坑了一下(花了1积分)囧 例子:
0
1
3    Z    Z
答案应该是 yes
/*time  memy
31ms 3854k
by orc
2015 4 16
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int vis[], vis2[];
int n, x;
int t;
char u, v, k;
vector<int> G[];
void read_graph()
{
cin >> n;
memset(vis,,sizeof vis );
for(int i = ; i < n; ++i)
{
cin >> t;
if(t == ) { cin >> k; vis[k - 'A'] = ; continue; }//单个点直接标记为成立
else if(t == ) { cin >> u >> v; G[u-'A'].push_back(v - 'A'); }
else { cin >> u >> v; G[u-'A'].push_back(v - 'A'); G[v - 'A'].push_back(u - 'A'); }
}
}
void dfs_pre(int m)
{
vis[m] = ;
int num = G[m].size();
for(int i = ; i < num; ++i)
if(! vis[ G[m][i] ]) dfs_pre(G[m][i]);
}
int dfs(int m,int tag)
{
int i;
vis2[m] = ;
if(m == tag) return ;
int num = G[m].size();
for(i = ; i < num ; ++i)
if(! vis2[ G[m][i] ] ) { if(dfs(G[m][i],tag)) return ; }
if(i >= num ) return ;
}
void solve()
{
int i;
read_graph();
for(i= ;i < ; ++i)//扫一遍,若某结点之前标记了,其邻接点也是成立的
if(vis[i]) dfs_pre(i);
cin >> x;
while(x --)
{
cin >> t;
if(t == ) {
cin >> k;
if(vis[k - 'A']) cout << "yes" <<endl;
else cout << "no" <<endl;
continue;
}
if(t == ){
memset(vis2, ,sizeof vis2 );
cin >> u >> v;
if(u == v) { cout << "yes" <<endl; continue; }//特判
int num = G[u - 'A'].size();
for(i = ; i < num; ++i)
if(! vis2[ G[u - 'A'][i] ]) { if(dfs(G[u - 'A'][i],v - 'A')) break; }
if(i >= num) cout << "no" <<endl;
else cout << "yes" <<endl;
}
else{
memset(vis2, ,sizeof vis2 );
cin >> u >> v;
if(u == v) { cout << "yes" <<endl; continue; }//特判
int leap , leap2;
int num, num2;
leap = leap2 = ;
num = G[u - 'A'].size();
num2 = G[v - 'A'].size();
for(i = ; i < num; ++i)//从 u->v 扫一遍u的邻接点
if(! vis2[ G[u - 'A'][i] ]) { if(leap = dfs(G[u - 'A'][i],v - 'A')) break; }
memset(vis2 , ,sizeof vis2);
for(i = ; i< num2 ; ++i)//从 v->u 扫一遍v的邻接点
if(! vis2[ G[v - 'A'][i] ]) { if(leap2 = dfs(G[v - 'A'][i],u - 'A')) break; }
if(leap && leap2) cout << "yes" <<endl;
else cout << "no" <<endl;
}
}
}
int main()
{
ios::sync_with_stdio();
solve();
return ;
}
/*坑爹例子
0
1
3 Z Z
ans:yes
*/

伪Acmer的推理(dfs/bfs)的更多相关文章

  1. 17232 伪Acmer的推理(传递闭包)

    17232 伪Acmer的推理 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 收入:0 题型: 编程题   语言: G++;GCC Description 现在正是期末, ...

  2. DFS/BFS+思维 HDOJ 5325 Crazy Bobo

    题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...

  3. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  4. ID(dfs+bfs)-hdu-4127-Flood-it!

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...

  5. [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  6. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  7. DFS/BFS视频讲解

    视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...

  8. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  9. [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)

    695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...

随机推荐

  1. svn 默认忽略静态库 .a文件解决办法

    我也是在向SVN服务器上传文件时,遇到了这个问题,文件上传后,再下载后发现所有的.a文件全部丢失,后来才知道是上传文件的时候.a文件根本就没传上去,查找原因才知道上传的时候.a文件被过滤掉了,后来找到 ...

  2. IOS-JSON & XML解析

    XML & JSON 简介 •JSON –作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 –基于JavaScript的一个子集 –易读性略差,编码手写难度大,数据量小 ...

  3. Servlet题库

    一.    填空题 Servlet中使用Session对象的步骤为:调用  HttpServletRequest.getSession()  得到Session对象,查看Session对象,在会话中保 ...

  4. ld returned 1 exit status"的解决办法

    在Linux下创建线程时,编译时会出现下面的错误,[root@linuxserver 807]# gcc -o 22 22.c/tmp/cc21HcoW.o(.text+0x4c): In funct ...

  5. 使用DateUtils和DateFormatUtils处理时间日期转换与SimpleDateFormat的区别

    在Apache Commons项目的Lang里面,有两个类:DateUtils和DateFormatUtils,专门用于处理时间日期转换.它们在 org.apache.commons.lang.tim ...

  6. NYOJ_37.回文字符串 (附滚动数组)

    时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问 ...

  7. Java中常见数据结构:list与map -底层如何实现

    1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构 ...

  8. 谈谈我的编程之路---WAMP(三)

    WAMP的一些配置与使用心得(APACHE)说实话,我感觉apache的配置真的还是蛮复杂的,感觉好像又在学一种语言,让我用比较庞大的概念来讲述这些东西,我也没办法做到就以实际应用出发出发,简单的说一 ...

  9. 两个viewport的故事(第二部分)

    原文:http://www.quirksmode.org/mobile/viewports2.html 在这个迷你系列的文章里边我将会解释viewport,以及许多重要元素的宽度是如何工作的,比如&l ...

  10. sql server 常用的函数小汇

    摘录些许sqlserver 常用到的一些函数,便于日常学习使用 一.字符转换函数1.ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来,但 ...