【BZOJ4956】Secret Chamber at Mount Rushmore
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4956
暂时结束DP的学习,开始图论的复习了,哦,复习,呵呵呵。。。
这是比较水的一道题,我们只关注从一个点是否有路径可以到达另一个点,而且数据范围又不大,显然是Floyd算法的应用,求传递闭包。
但是,好好读题,把题目的要求在代码当中体现得淋漓尽致,别问我为什么要说这个。。。
1 #include <cstdio> 2 #include <cstring> 3 4 const int maxa = 30, maxn = 55; 5 6 int f[maxa][maxa]; 7 char w1[maxn], w2[maxn]; 8 9 int main() { 10 int m, n; 11 char a, b; 12 scanf("%d%d", &m, &n); 13 for (int i = 1; i <= m; ++i) { 14 a = getchar(); 15 while (a < 'a' || a > 'z') a = getchar(); 16 b = getchar(); 17 while (b < 'a' || b > 'z') b = getchar(); 18 a = a - 'a' + 1, b = b - 'a' + 1; 19 f[(int)a][(int)b] = 1; 20 } 21 for (int i = 1; i <= 26; ++i) f[i][i] = 1; 22 for (int k = 1; k <= 26; ++k) 23 for (int i = 1; i <= 26; ++i) 24 for (int j = 1; j <= 26; ++j) 25 f[i][j] = f[i][j] || (f[i][k] && f[k][j]); 26 for (int i = 1; i <= n; ++i) { 27 scanf("%s%s", w1, w2); 28 int w1l = strlen(w1), w2l = strlen(w2), flag = 1; 29 if (w1l != w2l) { 30 printf("no\n"); 31 continue; 32 } 33 for (int j = 0; j < w1l; ++j) 34 if (!f[(int)w1[j] - 'a' + 1][(int)w2[j] - 'a' + 1]) { 35 printf("no\n"); 36 flag = 0; 37 break; 38 } 39 if (flag) printf("yes\n"); 40 } 41 return 0; 42 }