vadimk772336

принята

Mar 15th, 2022 (edited)
1,029
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct vertex
  4. {
  5.     bool isterminal;
  6.     int adj_list[26];
  7. };
  8.  
  9. struct cart_vertex
  10. {
  11.     int u;
  12.     int v;
  13.     bool isvisited;
  14. };
  15.  
  16. void addEdge(int i, int j, char symbol, struct vertex* DFA)
  17. {
  18.     int symbol_idx = static_cast<int>(symbol) - 97;
  19.     DFA[i].adj_list[symbol_idx] = j;
  20. }
  21.  
  22. void clean_DFA(struct vertex* DFA, int n)
  23. {
  24.     for (int i = 0; i < n; ++i)
  25.     {
  26.         DFA[i].isterminal = false;
  27.         for (int j = 0; j < 26; ++j)
  28.             DFA[i].adj_list[j] = -1;
  29.     }
  30. }
  31.  
  32.  
  33. void Fill_DFA(int n, int k, int l, struct vertex* DFA)
  34. {
  35.     int u, v;
  36.     int number_terminal;
  37.     char c;
  38.  
  39.     clean_DFA(DFA, n);
  40.  
  41.     for (int i = 0; i < k; ++i)
  42.     {
  43.         std::cin >> number_terminal;
  44.         DFA[number_terminal].isterminal = true;
  45.     }
  46.  
  47.     for (int i = 0; i < n * l; ++i)
  48.     {
  49.         std::cin >> u >> c >> v;
  50.         addEdge(u, v, c, DFA);
  51.     }
  52.  
  53.     return;
  54. }
  55.  
  56. void cartesian_product(struct cart_vertex* cart_graph, int n_one, int n_two)
  57. {
  58.  
  59.     int N = n_one * n_two;
  60.  
  61.     for (int i = 0; i < N; ++i)
  62.         cart_graph[i].isvisited = false;
  63.  
  64.     for (int i = 0; i < n_one; ++i)
  65.     {
  66.         for (int j = 0; j < n_two; ++j)
  67.         {
  68.             int idx = i * n_two + j;
  69.             cart_graph[idx].u = i;
  70.             cart_graph[idx].v = j;
  71.         }
  72.     }
  73. }
  74.  
  75.  
  76. void DFS(int v_idx, struct cart_vertex* graph, bool& is_equiv, int n_two, struct vertex* DFA_one,
  77.     struct vertex* DFA_two)
  78. {
  79.  
  80.     int a, b;
  81.     if (is_equiv)
  82.     {
  83.         int i = graph[v_idx].u;
  84.         int j = graph[v_idx].v;
  85.         if (DFA_one[i].isterminal != DFA_two[j].isterminal)
  86.         {
  87.             is_equiv = false;
  88.             return;
  89.         }
  90.  
  91.         graph[v_idx].isvisited = true;
  92.         for (int k = 0; k < 26; ++k)
  93.         {
  94.             a = DFA_one[i].adj_list[k];
  95.             b = DFA_two[j].adj_list[k];
  96.             if (a >= 0 && b >= 0)
  97.             {
  98.                 int idx = a * n_two + b;
  99.                 if (not graph[idx].isvisited)
  100.                     DFS(idx, graph, is_equiv, n_two, DFA_one, DFA_two);
  101.             }
  102.         }
  103.     }
  104.     return;
  105. }
  106.  
  107. void check_equiv(
  108.     struct cart_vertex* cart_graph, int n_two, struct vertex* DFA_one, struct vertex* DFA_two)
  109. {
  110.     bool is_equiv = true;
  111.     DFS(0, cart_graph, is_equiv, n_two, DFA_one, DFA_two);
  112.  
  113.     if (is_equiv)
  114.         std::cout << "EQUIVALENT";
  115.     else
  116.         std::cout << "NOT EQUIVALENT";
  117. }
  118.  
  119. int main()
  120. {
  121.  
  122.     int n_one, k_one, l_one;
  123.     int n_two, k_two, l_two;
  124.  
  125.     std::cin >> n_one >> k_one >> l_one;
  126.     vertex DFA_one[n_one];
  127.     Fill_DFA(n_one, k_one, l_one, DFA_one);
  128.  
  129.     std::cin >> n_two >> k_two >> l_two;
  130.     vertex DFA_two[n_two];
  131.     Fill_DFA(n_two, k_two, l_two, DFA_two);
  132.  
  133.     int N = n_one * n_two;
  134.     struct cart_vertex cart_graph[N];
  135.     cartesian_product(cart_graph, n_one, n_two);
  136.  
  137.     check_equiv(cart_graph, n_two, DFA_one, DFA_two);
  138.  
  139.     return 0;
  140. }
  141.  
Advertisement
Add Comment
Please, Sign In to add comment