vadimk772336

очищен v2 (без принтов)

Mar 14th, 2022 (edited)
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct my_pair
  4. {
  5.     int a;
  6.     int b;
  7. };
  8.  
  9. struct vertex
  10. {
  11.     bool isterminal;
  12.     int adj_list[26];
  13.     bool is_exist[26];
  14. };
  15.  
  16. struct cartesian_vertex
  17. {
  18.     int u;
  19.     int v;
  20.     bool isterminal;
  21.     bool isvisited;
  22.     struct my_pair adj_list[26];
  23.     bool is_exist[26] = { false }; //Если убрать = не будет работать
  24. };
  25.  
  26. void addEdge(int i, int j, char symbol, struct vertex* DFA)
  27. {
  28.     int symbol_idx = int(symbol) - 97;
  29.     DFA[i].adj_list[symbol_idx] = j;
  30.     DFA[i].is_exist[symbol_idx] = true;
  31. }
  32.  
  33. void Fill_DFA(int n, int k, int l, struct vertex* DFA)
  34. {
  35.     int u, v;
  36.     char c;
  37.     int terminals[k];
  38.  
  39.     for (int i = 0; i < k; ++i)
  40.         std::cin >> terminals[i];
  41.  
  42.     for (int i = 0; i < k; ++i)
  43.         DFA[terminals[i]].isterminal = true;
  44.  
  45.     for (int i = 0; i < n * l; ++i)
  46.     {
  47.         std::cin >> u >> c >> v;
  48.         addEdge(u, v, c, DFA);
  49.     }
  50.  
  51.     return;
  52. }
  53.  
  54. void clean_DFA(struct vertex* DFA, int n)
  55. {
  56.     for (int i = 0; i < n; i++)
  57.     {
  58.         DFA[i].isterminal = false;
  59.         for (int j = 0; j < 26; ++j)
  60.         {
  61.             DFA[i].adj_list[j] = -1;
  62.             DFA[i].is_exist[j] = false;
  63.         }
  64.     }
  65. }
  66.  
  67. void clean_DFA2(struct cartesian_vertex* DFA, int n)
  68. {
  69.     for (int i = 0; i < n; i++)
  70.     {
  71.         DFA[i].isterminal = false;
  72.         DFA[i].isvisited = false;
  73.         for (int j = 0; j < 26; ++j)
  74.             DFA[i].is_exist[j] = false;
  75.     }
  76. }
  77.  
  78. void cartesian_product(
  79.     struct cartesian_vertex* dec_graph, struct vertex* DFA1, struct vertex* DFA2, int n1, int n2)
  80. {
  81.  
  82.     int N = n1 * n2;
  83.     cartesian_vertex buff;
  84.     struct my_pair dec_ver;
  85.  
  86.     clean_DFA2(dec_graph, N);
  87.  
  88.     for (int i = 0; i < n1; ++i)
  89.     {
  90.         for (int j = 0; j < n2; ++j)
  91.         {
  92.             buff.u = i;
  93.             buff.v = j;
  94.             buff.isterminal = (DFA1[i].isterminal != DFA2[j].isterminal);
  95.  
  96.             for (int k = 0; k < 26; ++k)
  97.             {
  98.                 if (DFA1[i].is_exist[k] && DFA2[j].is_exist[k])
  99.                 {
  100.                     dec_ver.a = DFA1[i].adj_list[k];
  101.                     dec_ver.b = DFA2[j].adj_list[k];
  102.                     buff.adj_list[k] = dec_ver;
  103.                     buff.is_exist[k] = true;
  104.                 }
  105.                 else
  106.                     dec_graph[i * n2 + j].is_exist[k] = false;
  107.             }
  108.  
  109.             dec_graph[i * n2 + j] = buff;
  110.         }
  111.     }
  112. }
  113.  
  114. void DFS(int v_idx, struct cartesian_vertex* graph, bool& flag, int n2)
  115. {
  116.  
  117.     int a, b;
  118.     if (flag)
  119.     {
  120.         if (graph[v_idx].isterminal)
  121.         {
  122.             flag = false;
  123.             a = graph[v_idx].u;
  124.             b = graph[v_idx].v;
  125.             return;
  126.         }
  127.  
  128.         graph[v_idx].isvisited = true;
  129.  
  130.         for (int i = 0; i < 26; ++i)
  131.         {
  132.             if (graph[v_idx].is_exist[i])
  133.             {
  134.                 int a = graph[v_idx].adj_list[i].a;
  135.                 int b = graph[v_idx].adj_list[i].b;
  136.                 int idx = a * n2 + b;
  137.                 if (not graph[idx].isvisited)
  138.                     DFS(idx, graph, flag, n2);
  139.             }
  140.         }
  141.     }
  142.     return;
  143. }
  144.  
  145. int main()
  146. {
  147.  
  148.     int n1, k1, l1;
  149.     int n2, k2, l2;
  150.  
  151.     std::cin >> n1 >> k1 >> l1;
  152.     vertex DFA1[n1];
  153.     clean_DFA(DFA1, n1);
  154.     Fill_DFA(n1, k1, l1, DFA1);
  155.  
  156.     std::cin >> n2 >> k2 >> l2;
  157.     vertex DFA2[n2];
  158.     clean_DFA(DFA2, n2);
  159.     Fill_DFA(n2, k2, l2, DFA2);
  160.  
  161.     int N = n1 * n2;
  162.     struct cartesian_vertex dec_graph[N];
  163.     cartesian_product(dec_graph, DFA1, DFA2, n1, n2);
  164.  
  165.     bool flag = true;
  166.     DFS(0, dec_graph, flag, n2);
  167.  
  168.     if (flag)
  169.         std::cout << "EQUIVALENT";
  170.     else
  171.         std::cout << "NOT EQUIVALENT";
  172.  
  173.     return 0;
  174. }
  175.  
Add Comment
Please, Sign In to add comment