vadimk772336

очищен, работает

Mar 14th, 2022
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.88 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct vertex
  4. {
  5.     bool isterminal = false;
  6.     int adj_list[26];
  7.     bool is_exist[26];
  8. };
  9.  
  10. struct my_pair
  11. {
  12.     int a;
  13.     int b;
  14. };
  15.  
  16. struct vertex_2
  17. {
  18.     int u;
  19.     int v;
  20.     bool isterminal = false;
  21.     bool isvisited = false;
  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 display(struct vertex* DFA, int n)
  55. {
  56.     std::cout << "\n print:" << std::endl;
  57.     for (int i = 0; i < n; i++)
  58.     {
  59.         std::cout << "vertex: " << i << " ";
  60.         if (DFA[i].isterminal)
  61.             std::cout << "isterminal"
  62.                       << " ";
  63.  
  64.         std::cout << "adj_vertexes: ";
  65.         for (int j = 0; j < 26; ++j)
  66.         {
  67.             if (DFA[i].is_exist[j] == true)
  68.                 std::cout << "(" << char(j + 97) << "," << DFA[i].adj_list[j] << "); ";
  69.         }
  70.         std::cout << std::endl;
  71.     }
  72. }
  73.  
  74. void clean_DFA(struct vertex* DFA, int n)
  75. {
  76.     for (int i = 0; i < n; i++)
  77.     {
  78.         DFA[i].isterminal = false;
  79.  
  80.         for (int j = 0; j < 26; ++j)
  81.         {
  82.             DFA[i].adj_list[j] = -1;
  83.             DFA[i].is_exist[j] = false;
  84.         }
  85.     }
  86. }
  87.  
  88. void clean_DFA2(struct vertex_2* DFA, int n)
  89. {
  90.     for (int i = 0; i < n; i++)
  91.     {
  92.         DFA[i].isterminal = false;
  93.         DFA[i].isvisited = false;
  94.  
  95.         for (int j = 0; j < 26; ++j)
  96.         {
  97.             DFA[i].is_exist[j] = false;
  98.         }
  99.     }
  100. }
  101.  
  102. void display2(struct vertex_2* DFA, int n)
  103. {
  104.     std::cout << "\n print:" << std::endl;
  105.     for (int i = 0; i < n; i++)
  106.     {
  107.         std::cout << "vertex: (" << DFA[i].u << "," << DFA[i].v << ") ";
  108.         if (DFA[i].isterminal)
  109.             std::cout << "(isterminal)"
  110.                       << " ";
  111.  
  112.         std::cout << "adj_vertexes: ";
  113.         for (int j = 0; j < 26; ++j)
  114.         {
  115.             if (DFA[i].is_exist[j] == true)
  116.                 std::cout << char(j + 97) << "->(" << DFA[i].adj_list[j].a << ","
  117.                           << DFA[i].adj_list[j].b << "); ";
  118.         }
  119.         std::cout << std::endl;
  120.     }
  121. }
  122.  
  123. void cartesian_product(
  124.     struct vertex_2* dec_graph, struct vertex* DFA1, struct vertex* DFA2, int n1, int n2)
  125. {
  126.  
  127.     int v1, v2;
  128.     int N = n1 * n2;
  129.     vertex_2 buff;
  130.     struct my_pair dec_ver;
  131.  
  132.     clean_DFA2(dec_graph, N);
  133.  
  134.     for (int i = 0; i < n1; ++i)
  135.     {
  136.         for (int j = 0; j < n2; ++j)
  137.         {
  138.             buff.u = i;
  139.             buff.v = j;
  140.             buff.isterminal = (DFA1[i].isterminal != DFA2[j].isterminal);
  141.  
  142.             for (int k = 0; k < 26; ++k)
  143.             {
  144.                 if (DFA1[i].is_exist[k] && DFA2[j].is_exist[k])
  145.                 {
  146.                     dec_ver.a = DFA1[i].adj_list[k];
  147.                     dec_ver.b = DFA2[j].adj_list[k];
  148.                     buff.adj_list[k] = dec_ver;
  149.                     buff.is_exist[k] = true;
  150.                 }
  151.                 else
  152.                     dec_graph[i * n2 + j].is_exist[k] = false;
  153.             }
  154.  
  155.             dec_graph[i * n2 + j] = buff;
  156.         }
  157.     }
  158. }
  159.  
  160. void DFS(int v_idx, struct vertex_2* graph, bool& flag, int n2)
  161. {
  162.  
  163.     int a, b;
  164.     if (flag)
  165.     {
  166.         if (graph[v_idx].isterminal)
  167.         {
  168.             flag = false;
  169.             a = graph[v_idx].u;
  170.             b = graph[v_idx].v;
  171.             return;
  172.         }
  173.  
  174.         graph[v_idx].isvisited = true;
  175.  
  176.         for (int i = 0; i < 26; ++i)
  177.         {
  178.             if (graph[v_idx].is_exist[i])
  179.             {
  180.                 int a = graph[v_idx].adj_list[i].a;
  181.                 int b = graph[v_idx].adj_list[i].b;
  182.                 int idx = a * n2 + b;
  183.                 if (not graph[idx].isvisited)
  184.                     DFS(idx, graph, flag, n2);
  185.             }
  186.         }
  187.     }
  188.     return;
  189. }
  190.  
  191. int main()
  192. {
  193.  
  194.     int n1, k1, l1;
  195.     int n2, k2, l2;
  196.  
  197.     std::cin >> n1 >> k1 >> l1;
  198.     vertex DFA1[n1];
  199.     clean_DFA(DFA1, n1);
  200.     Fill_DFA(n1, k1, l1, DFA1);
  201.  
  202.     std::cin >> n2 >> k2 >> l2;
  203.     vertex DFA2[n2];
  204.     clean_DFA(DFA2, n2);
  205.     Fill_DFA(n2, k2, l2, DFA2);
  206.  
  207.     int N = n1 * n2;
  208.     struct vertex_2 dec_graph[N];
  209.     cartesian_product(dec_graph, DFA1, DFA2, n1, n2);
  210.  
  211.     bool flag = true;
  212.     DFS(0, dec_graph, flag, n2);
  213.  
  214.     if (flag)
  215.         std::cout << "EQUIVALENT";
  216.     else
  217.         std::cout << "NOT EQUIVALENT";
  218.  
  219.     return 0;
  220. }
  221.  
Advertisement
Add Comment
Please, Sign In to add comment