Advertisement
IzhanVarsky

Untitled

May 1st, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. #include <fstream>
  2. //#include <iostream>
  3. #include <vector>
  4. #include <set>
  5. #include <queue>
  6. #include <string>
  7.  
  8. using namespace std;
  9. vector<bool> isTermin1;
  10. vector<bool> isTermin2;
  11. vector<bool> used;
  12. vector<vector<int>> aut1; // [i][c] перейти из состояния i по символу (с + 'a')
  13. vector<vector<int>> aut2;
  14.  
  15. bool check(int a = 1, int b = 1) {
  16. if (isTermin1[a] != isTermin2[b]) {
  17. return false;
  18. }
  19. used[a] = true;
  20. for (int i = 0; i < 26; ++i) {
  21. if ((aut1[a][i] != 0 && aut2[b][i] == 0) || (aut1[a][i] == 0 && aut2[b][i] != 0) ||
  22. (!used[aut1[a][i]] && !check(aut1[a][i], aut2[b][i]))) {
  23. return false;
  24. }
  25. }
  26. return true;
  27. }
  28.  
  29. int main() {
  30. int n1, m1, k1, n2, m2, k2;
  31. ifstream cin("isomorphism.in");
  32. ofstream cout("isomorphism.out");
  33. cin >> n1 >> m1 >> k1;
  34. isTermin1.resize(n1 + 1);
  35. used.resize(n1 + 1);
  36. aut1.assign(n1 + 1, vector<int>(26, 0));
  37. for (int i = 0; i < k1; ++i) {
  38. int q;
  39. cin >> q;
  40. isTermin1[q] = true;
  41. }
  42. for (int i = 0; i < m1; ++i) {
  43. int a, b;
  44. char c;
  45. cin >> a >> b >> c;
  46. aut1[a][c - 'a'] = b;
  47. }
  48.  
  49. cin >> n2 >> m2 >> k2;
  50. if (n1 != n2) {
  51. cout << "NO";
  52. return 0;
  53. }
  54. isTermin2.resize(n2 + 1);
  55. aut2.assign(n2 + 1, vector<int>(26, 0));
  56. for (int i = 0; i < k2; ++i) {
  57. int q;
  58. cin >> q;
  59. isTermin2[q] = true;
  60. }
  61. for (int i = 0; i < m2; ++i) {
  62. int a, b;
  63. char c;
  64. cin >> a >> b >> c;
  65. aut2[a][c - 'a'] = b;
  66. }
  67. if (check()) {
  68. cout << "YES";
  69. } else {
  70. cout << "NO";
  71. }
  72. return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement