17232 伪Acmer的推理(传递闭包)
17232 伪Acmer的推理
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0 收入:0
题型: 编程题 语言: G++;GCC
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#不是输入输出的一部分。 注意区别命题和逻辑关系成立的不同。
#include <iostream> #include <cstdio> using namespace std; int a[30][30]; int n; void Warshall() { int i,j,k; for(k=0; k<26; k++) //依次取得的可以作为中间点的顶点 { for(i=0; i<26; i++) { for(j=0; j<26; j++) { if (a[i][k]>0&&a[k][j]>0) { if (a[i][i]==2||a[k][k]==2) a[j][j]=2; if (a[i][j]!=2) a[i][j]=1; } } } } } int main() { // freopen("data.txt","r",stdin); int m,t; char ch1,ch2; scanf("%d\n",&n); for (int j=0; j<26; j++) { a[j][j]=1; } for (int i=0; i<n; i++) { scanf("%d\n",&t); if (t==1) { scanf("%c",&ch1); a[ch1-'A'][ch1-'A']=2; } else if (t==2) { scanf("%c\t%c",&ch1,&ch2); a[ch1-'A'][ch2-'A']=1; } else if (t==3) { scanf("%c\t%c",&ch1,&ch2); a[ch1-'A'][ch2-'A']=1; a[ch2-'A'][ch1-'A']=1; } } Warshall(); scanf("%d\n",&m); for (int i=0; i<m; i++) { scanf("%d\n",&t); if (t==1) { scanf("%c",&ch1); if (a[ch1-'A'][ch1-'A']==2) { printf("yes\n"); continue; } } else if (t==2) { scanf("%c\t%c",&ch1,&ch2); if (a[ch1-'A'][ch2-'A']!=0) { printf("yes\n"); continue; } } else if (t==3) { scanf("%c\t%c",&ch1,&ch2); if (a[ch1-'A'][ch2-'A']!=0&&a[ch2-'A'][ch1-'A']!=0) { printf("yes\n"); continue; } } printf("no\n"); } return 0; }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~