vadimk772336

развернул ребра

Mar 15th, 2022 (edited)
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. struct my_pair
  6. {
  7.     int a;
  8.     int b;
  9. };
  10.  
  11. struct vertex
  12. {
  13.     bool isterminal;
  14.     int adj_list[26];
  15. };
  16.  
  17. struct cart_vertex
  18. {
  19.     int u;
  20.     int v;
  21.     bool isvisited;
  22.     struct my_pair adj_list[26];
  23.     vector<int> reverse_adj_list;
  24.     int list_size = 0;
  25. };
  26.  
  27. void addEdge(int i, int j, char symbol, struct vertex* DFA)
  28. {
  29.     int symbol_idx = static_cast<int>(symbol) - 97;
  30.     DFA[i].adj_list[symbol_idx] = j;
  31. }
  32.  
  33. void clean_DFA(struct vertex* DFA, int n)
  34. {
  35.     for (int i = 0; i < n; ++i)
  36.     {
  37.         DFA[i].isterminal = false;
  38.         for (int j = 0; j < 26; ++j)
  39.             DFA[i].adj_list[j] = -1;
  40.     }
  41. }
  42.  
  43.  
  44. void Fill_DFA(int n, int k, int l, struct vertex* DFA)
  45. {
  46.     int u, v;
  47.     int number_terminal;
  48.     char c;
  49.  
  50.     clean_DFA(DFA, n);
  51.  
  52.     for (int i = 0; i < k; ++i)
  53.     {
  54.         std::cin >> number_terminal;
  55.         DFA[number_terminal].isterminal = true;
  56.     }
  57.  
  58.     for (int i = 0; i < n * l; ++i)
  59.     {
  60.         std::cin >> u >> c >> v;
  61.         addEdge(u, v, c, DFA);
  62.     }
  63.  
  64.     return;
  65. }
  66.  
  67. void clean_DFA_two(struct cart_vertex* DFA, int n)
  68. {
  69.     for (int i = 0; i < n; ++i)
  70.     {
  71.         DFA[i].isvisited = false;
  72.         DFA[i].list_size = 0;
  73.         //for (int j = 0; j < 26; ++j)
  74.         //    DFA[i].reverse_adj_list[j] = -1;
  75.     }
  76. }
  77.  
  78. void cart_product(struct cart_vertex* dec_graph,
  79.             struct vertex* DFA_one, int n_one, std::vector<int>& list_of_terminals)
  80. {
  81.  
  82.     int N = n_one * n_one;
  83.  
  84.     clean_DFA_two(dec_graph, N);
  85.  
  86.     for (int i = 0; i < n_one; ++i)
  87.     {
  88.         for (int j = 0; j < n_one; ++j)
  89.         {
  90.             int idx = i * n_one + j;
  91.  
  92.             dec_graph[idx].u = i;
  93.             dec_graph[idx].v = j;
  94.  
  95.             if (DFA_one[i].isterminal != DFA_one[j].isterminal)
  96.             {
  97.                 list_of_terminals.push_back(idx);
  98.             }
  99.  
  100.             for (int k = 0; k < 26; ++k)
  101.             {
  102.                 if (DFA_one[i].adj_list[k] >= 0 && DFA_one[j].adj_list[k] >= 0)
  103.                 {
  104.                     dec_graph[idx].adj_list[k].a = DFA_one[i].adj_list[k];
  105.                     dec_graph[idx].adj_list[k].b = DFA_one[j].adj_list[k];
  106.                 }
  107.                 else
  108.                 {
  109.                     dec_graph[idx].adj_list[k].a = -1;
  110.                     dec_graph[idx].adj_list[k].b = -1;
  111.                 }
  112.             }
  113.         }
  114.     }
  115. }
  116.  
  117. void reverse_cart_graph(struct cart_vertex* graph, int N, int n_one)
  118. {
  119.     int a,b,idx;
  120.     for (int i = 0; i < N; ++i)
  121.     {
  122.         for (int j = 0; j < 26; ++j)
  123.         {
  124.             a = graph[i].adj_list[j].a;
  125.             b = graph[i].adj_list[j].b;
  126.             idx = a * n_one + b;
  127.            
  128.             if (a >= 0 && b >= 0)
  129.             {
  130.                 graph[idx].reverse_adj_list.push_back(i);
  131.                 graph[idx].list_size++;
  132.             }
  133.             //else
  134.             //    graph[idx].reverse_adj_list[j] = -5;
  135.         }
  136.        
  137.     }
  138. }
  139.  
  140. void display2(struct cart_vertex* DFA, int n)
  141. {
  142.     std::cout << "\n print:" << std::endl;
  143.     for (int i = 0; i < n; i++)
  144.     {
  145.         std::cout << "vertex: (" << DFA[i].u << "," << DFA[i].v << ") ";
  146.  
  147.  
  148.         std::cout << "adj_vertexes: ";
  149.         for (int j = 0; j < 26; ++j)
  150.         {
  151.             if (DFA[i].adj_list[j].a != -1)
  152.                 std::cout << char(j + 97) << "->(" << DFA[i].adj_list[j].a << ","
  153.                           << DFA[i].adj_list[j].b << "); ";
  154.         }
  155.         std::cout << std::endl;
  156.     }
  157. }
  158.  
  159. void display2_reverse(struct cart_vertex* DFA, int n)
  160. {
  161.     std::cout << "\n print:" << std::endl;
  162.     for (int i = 0; i < n; i++)
  163.     {
  164.         std::cout << "vertex: (" << DFA[i].u << "," << DFA[i].v << ") ";
  165.  
  166.  
  167.         std::cout << "adj_vertexes: ";
  168.         for (int j = 0; j < DFA[i].reverse_adj_list.size(); ++j)
  169.         {
  170.             int num = DFA[i].reverse_adj_list[j];
  171.             std::cout << "(" << DFA[num].u << "," << DFA[num].v << "); ";
  172.         }
  173.         std::cout << std::endl;
  174.     }
  175. }
  176.  
  177. void DFS(int v_idx, struct cart_vertex* graph, int N)
  178. {
  179.  
  180.     int a, b, idx;
  181.     graph[v_idx].isvisited = true;
  182.    
  183.     int count = graph[v_idx].list_size;
  184.     for (int k = 0; k < count; ++k)
  185.     {
  186.         idx = graph[v_idx].reverse_adj_list[k];
  187.         if (idx >= 0 && not graph[idx].isvisited)
  188.                 DFS(idx, graph, N);
  189.     }
  190.    
  191.     return;
  192. }
  193.  
  194. /*
  195. void check_equiv(struct cart_vertex* cart_graph, int N)
  196. {
  197.    
  198.     for (int i = 0; i < N; ++i)
  199.     {
  200.         if (not cart_graph[i].isvisited)
  201.     }
  202.  
  203.     if (is_equiv)
  204.         std::cout << "EQUIVALENT";
  205.     else
  206.         std::cout << "NOT EQUIVALENT";
  207. }
  208. */
  209.  
  210. int main()
  211. {
  212.  
  213.     int n_one, k_one, l_one;
  214.  
  215.     std::cin >> n_one >> k_one >> l_one;
  216.     vertex DFA_one[n_one];
  217.     Fill_DFA(n_one, k_one, l_one, DFA_one);
  218.  
  219.     int N = n_one * n_one;
  220.     struct cart_vertex cart_graph[N];
  221.     vector<int> list_of_terminals;
  222.  
  223.     cart_product(cart_graph, DFA_one, n_one, list_of_terminals);
  224.  
  225.     display2(cart_graph, N);
  226.    
  227.     reverse_cart_graph(cart_graph, N, n_one);
  228.    
  229.    
  230.     display2_reverse(cart_graph, N);
  231.    
  232.    
  233.     for (int i = 0; i < list_of_terminals.size(); ++i)
  234.     {
  235.         cout << "i: " << i << " " << list_of_terminals[i] << "; " << endl;
  236.         DFS(list_of_terminals[i], cart_graph, N);
  237.     }
  238.     cout << "Done" << endl;
  239.     check_equiv(cart_graph, N);
  240.    
  241.     return 0;
  242. }
  243.  
Add Comment
Please, Sign In to add comment