Advertisement
vadimk772336

Untitled

Mar 20th, 2022
1,849
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.83 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.  
  96.                
  97.  
  98.             if (DFA_one[i].isterminal != DFA_one[j].isterminal)
  99.             {
  100.                 list_of_terminals.push_back(idx);
  101.             }
  102.  
  103.             for (int k = 0; k < 26; ++k)
  104.             {
  105.                 if (DFA_one[i].adj_list[k] >= 0 && DFA_one[j].adj_list[k] >= 0)
  106.                 {
  107.                     dec_graph[idx].adj_list[k].a = DFA_one[i].adj_list[k];
  108.                     dec_graph[idx].adj_list[k].b = DFA_one[j].adj_list[k];
  109.                 }
  110.                 else
  111.                 {
  112.                     dec_graph[idx].adj_list[k].a = -1;
  113.                     dec_graph[idx].adj_list[k].b = -1;
  114.                 }
  115.             }
  116.         }
  117.     }
  118. }
  119.  
  120. void reverse_cart_graph(struct cart_vertex* graph, int N, int n_one)
  121. {
  122.     int a,b,idx;
  123.     for (int i = 0; i < N; ++i)
  124.     {
  125.         for (int j = 0; j < 26; ++j)
  126.         {
  127.             a = graph[i].adj_list[j].a;
  128.             b = graph[i].adj_list[j].b;
  129.             idx = a * n_one + b;
  130.            
  131.             if (a >= 0 && b >= 0)
  132.             {
  133.                 graph[idx].reverse_adj_list.push_back(i);
  134.                 graph[idx].list_size++;
  135.             }
  136.             //else
  137.             //    graph[idx].reverse_adj_list[j] = -5;
  138.         }
  139.        
  140.     }
  141. }
  142.  
  143. void display2(struct cart_vertex* DFA, int n)
  144. {
  145.     std::cout << "\n print:" << std::endl;
  146.     for (int i = 0; i < n; i++)
  147.     {
  148.         std::cout << "vertex: (" << DFA[i].u << "," << DFA[i].v << ") ";
  149.  
  150.  
  151.         std::cout << "adj_vertexes: ";
  152.         for (int j = 0; j < 26; ++j)
  153.         {
  154.             if (DFA[i].adj_list[j].a != -1)
  155.                 std::cout << char(j + 97) << "->(" << DFA[i].adj_list[j].a << ","
  156.                           << DFA[i].adj_list[j].b << "); ";
  157.         }
  158.         std::cout << std::endl;
  159.     }
  160. }
  161.  
  162. void display2_reverse(struct cart_vertex* DFA, int n)
  163. {
  164.     std::cout << "\n print:" << std::endl;
  165.     for (int i = 0; i < n; i++)
  166.     {
  167.         std::cout << "vertex: (" << DFA[i].u << "," << DFA[i].v << ") ";
  168.  
  169.         if (not DFA[i].isvisited)
  170.             std::cout << " (not visited) ";
  171.         std::cout << "adj_vertexes: ";
  172.         for (int j = 0; j < DFA[i].reverse_adj_list.size(); ++j)
  173.         {
  174.             int num = DFA[i].reverse_adj_list[j];
  175.             std::cout << "(" << DFA[num].u << "," << DFA[num].v << "); ";
  176.         }
  177.         std::cout << std::endl;
  178.     }
  179. }
  180.  
  181. void DFS(int v_idx, struct cart_vertex* graph, int N)
  182. {
  183.  
  184.     int a, b, idx;
  185.     graph[v_idx].isvisited = true;
  186.    
  187.     int count = graph[v_idx].list_size;
  188.     for (int k = 0; k < count; ++k)
  189.     {
  190.         idx = graph[v_idx].reverse_adj_list[k];
  191.         if (idx >= 0 && not graph[idx].isvisited)
  192.                 DFS(idx, graph, N);
  193.     }
  194.    
  195.     return;
  196. }
  197.  
  198. /*
  199. void check_equiv(struct cart_vertex* cart_graph, int N)
  200. {
  201.    
  202.     for (int i = 0; i < N; ++i)
  203.     {
  204.         if (not cart_graph[i].isvisited)
  205.     }
  206.  
  207.     if (is_equiv)
  208.         std::cout << "EQUIVALENT";
  209.     else
  210.         std::cout << "NOT EQUIVALENT";
  211. }
  212. */
  213.  
  214. bool is_same_group(cart_vertex* a, cart_vertex* b)
  215. {
  216.  
  217.     return (a->u == b->u || a->u == b->v || a->v == b->u || a->u == b->v);
  218.    
  219. }
  220.  
  221. int main()
  222. {
  223.  
  224.     int n_one, k_one, l_one;
  225.  
  226.     std::cin >> n_one >> k_one >> l_one;
  227.     vertex DFA_one[n_one];
  228.     Fill_DFA(n_one, k_one, l_one, DFA_one);
  229.  
  230.     int N = n_one * n_one;
  231.     struct cart_vertex cart_graph[N];
  232.     vector<int> list_of_terminals;
  233.  
  234.     cart_product(cart_graph, DFA_one, n_one, list_of_terminals);
  235.  
  236.     display2(cart_graph, N);
  237.    
  238.     reverse_cart_graph(cart_graph, N, n_one);
  239.    
  240.    
  241.     display2_reverse(cart_graph, N);
  242.    
  243.    
  244.     for (int i = 0; i < list_of_terminals.size(); ++i)
  245.     {
  246.         cout << "i: " << i << " " << list_of_terminals[i] << "; " << endl;
  247.         DFS(list_of_terminals[i], cart_graph, N);
  248.     }
  249.    
  250.     display2_reverse(cart_graph, N);
  251.    
  252.    
  253.     vector<int> not_visitied_list;
  254.     for (int i =0; i < N; ++i)
  255.     {
  256.         if (not cart_graph[i].isvisited ) //&& cart_graph[i].u != cart_graph[i].v
  257.         {
  258.             not_visitied_list.push_back(i);
  259.             cout << i << " ";
  260.         }
  261.     }
  262.     cout << endl;
  263.    
  264.     int m = not_visitied_list.size();
  265.    
  266.     int idx_to_group[n_one];
  267.     for (int i =0; i < n_one; ++i)
  268.         idx_to_group[i] = -1;
  269.        
  270.     int curr_num_group = -1;
  271.    
  272.     bool selected[m];
  273.     for (int i =0; i < m; ++i)
  274.         selected[i] = false;
  275.        
  276.    
  277.     int idx;
  278.     //idx = not_visitied_list[0];
  279.     //idx_to_group[cart_graph[idx].u] = u;
  280.     //idx_to_group[cart_graph[idx].v] = u;
  281.     for (int i =0; i < m; ++i)
  282.     {
  283.         if (idx_to_group[i] == -1)
  284.         {
  285.             for (int j =0; j < m; ++j)
  286.             {
  287.                 int idx = not_visitied_list[j];
  288.                 if (cart_graph[idx].u == i || idx_to_group[cart_graph[idx].u] == i)
  289.                 {
  290.                     idx_to_group[cart_graph[idx].v] = i;
  291.                 }
  292.                 if (cart_graph[idx].v == i || idx_to_group[cart_graph[idx].v] == i)
  293.                 {
  294.                     idx_to_group[cart_graph[idx].u] = i;
  295.                 }
  296.                
  297.             }
  298.            
  299.         }
  300.        
  301.         idx_to_group[i] == i;
  302.     }
  303.     /*
  304.     for (int i =0; i < m; ++i)
  305.     {
  306.         if (not selected[i])
  307.         {
  308.             curr_num_group++;
  309.             idx_to_group[i] = curr_num_group;
  310.             for (int j =i+1; j < m; ++j)
  311.             {
  312.                 if (not selected[j])
  313.                 {
  314.                     if (is_same_group(&cart_graph[not_visitied_list[i]], &cart_graph[not_visitied_list[j]]))
  315.                     {
  316.                         idx_to_group[j] = curr_num_group;
  317.                         selected[j] = true;
  318.                     }
  319.                    
  320.                 }
  321.             }  
  322.            
  323.         }
  324.        
  325.         selected[i]=true;
  326.  
  327.     }
  328.     */
  329.    
  330.     for (int i =0; i < n_one; ++i)
  331.         cout << idx_to_group[i] << ", ";
  332.     cout << "Done" << endl;
  333.     //check_equiv(cart_graph, N);
  334.    
  335.    
  336.     return 0;
  337. }
  338.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement