bzoj 4956: [Wf2017]Secret Chamber at Mount Rushmore(最短路)

来源:互联网 发布:栗山千明知乎 编辑:程序博客网 时间:2024/05/17 22:08

4956: [Wf2017]Secret Chamber at Mount Rushmore

Time Limit: 1 Sec  Memory Limit: 1024 MB
Submit: 141  Solved: 104
[Submit][Status][Discuss]

Description

你现在可能已经听说过Rushmore山上有一个壮观的石雕刻画了四位著名的美国总统。然而,很少有人知道这个纪念雕刻暗藏一个秘密的房间。这听起来像是一部好莱坞电影的情节,但是这个房间是真实存在的。它藏在Abraham Lin coln的头后面,它被设计成一个档案库,用来存放美国历史上重要的文件与文物。历史学家声称这个档案库的建造在1939年被中断,直到20世纪90年代末才能被访问,但这不是全部的真相。在1982年,著名的考古学家S. Dakota Jones秘密地访问了这座纪念雕刻,发现房间已经完成建造,但不对外公开。这似乎有些可疑,经过一些开凿,她发现一个隐藏的地下室和一些文件。不幸的是,这些文件没什么有效信息,都是很无聊的内容。她猜测这些内容被加密了,但是她费尽心机还是无法解密。在这周的前些时候, Jones博士在当地参加ACM-ICPC世界总决赛, 她终于在South DakotaSchool of Mines and Technology的Connolly Hall发现了破译这些文件的密钥。她发现文件包含了一系列字母转换规则。一些字母可以经过多次转换,但一些字母没有转换规则。经过对那份无聊的文件中的单词多次转换之后,她似乎能把内容破译成美国历史上的文件,例如独立宣言和美国宪法。她需要你的帮助。你将得到字母可能的转换规则和一系列原始单词与解密单词。你的任务是验证每对单词是否匹配。如果两个单词具有相同的长度,且第一个单词的每个字母可以用转换规则多次转换后变成第二个单词中对应位置的字母,则两个单词匹配。

Input

第一行包含两个整数m(1≤m≤500)和n(1≤n≤50),其中m表示字母转换规则的数量,n表示单词对的数量。
接下来m行,每行包含两个不同的字母a和b,表示字母a可以转换成字母b。每个有序对(a,b)只会出现至多一次。
接下来n 行,每行包含一对需要检查的单词。
转换规则和单词只会使用小写字母'a'到'z',且每个单词包含至少1个字母,至多50个字母。

Output

对于每对单词,如果两个单词可以匹配,输出yes,否则输出no。

Sample Input

9 5
c t
i r
k p
o c
r o
t e
t f
u h
w p
we we
can the
work people
it of
out the
3 3
a c
b a
a b
aaa abc
abc aaa
acm bcm

Sample Output

yes
no
no
yes
yes
yes
no
yes


如果字符a能转换成字符b,那么a到b连一条有向边

相同字母连一条有向边(自环)

floyd后判断两个单词是否匹配只要看每对字母之间是否都有边

#include<stdio.h>#include<string.h>int road[27][27];int main(void){char a, b, s1[55], s2[55];int m, n, i, j, k;scanf("%d%d", &m, &n);for(i=1;i<=m;i++){scanf(" %c %c", &a, &b);road[a-'a'][b-'a'] = 1;}for(i=0;i<=25;i++)road[i][i] = 1;for(k=0;k<=25;k++){for(i=0;i<=25;i++){for(j=0;j<=25;j++){if(road[i][k] && road[k][j])road[i][j] = 1;}}}for(i=1;i<=n;i++){scanf("%s%s", s1+1, s2+1);if(strlen(s1+1)!=strlen(s2+1))printf("no\n");else{for(j=1;s1[j]!='\0';j++){if(road[s1[j]-'a'][s2[j]-'a']==0)break;}if(s1[j]==0)printf("yes\n");elseprintf("no\n");}}return 0;}