vadimk772336

v2

Mar 14th, 2022
669
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <map>
  5. using namespace std;
  6.  
  7. struct vertex
  8. {
  9.     bool isterminal = false;
  10.     // mapchar,int adj_list; // Заменить на массив длины 26
  11.     int adj_list[26];
  12.     bool is_exist[26];
  13.     // vector<int> adj_list(26,-1);
  14.     int list_size = 0;
  15.     int number_vertex;
  16. };
  17.  
  18. struct my_pair
  19. {
  20.     int a;
  21.     int b;
  22. };
  23.  
  24. struct vertex_2
  25. {
  26.     int u;
  27.     int v;
  28.     bool isterminal = false;
  29.     bool isvisited = false;
  30.     struct my_pair adj_list[26];
  31.     bool is_exist[26] = { false };
  32.     int number_in_array;
  33. };
  34.  
  35.  
  36.  
  37.  
  38. struct adj_vertex
  39. {
  40.     int number_vertex;
  41.     char symbol;
  42. };
  43.  
  44. void addEdge(int i, int j, char symbol, struct vertex* DFA)
  45. {
  46.     int symbol_idx = int(symbol) - 97;
  47.     DFA[i].adj_list[symbol_idx] = j;
  48.     DFA[i].is_exist[symbol_idx] = true;
  49.     DFA[i].list_size++;
  50. }
  51.  
  52. void Fill_DFA(int n, int k, int l, vector<char>& alphabet, struct vertex* DFA)
  53. {
  54.     int u, v, c_idx;
  55.     char c;
  56.     int terminals[k];
  57.  
  58.     int indicators[26] = { 0 };
  59.  
  60.     for (int i = 0; i < k; ++i)
  61.         cin >> terminals[i];
  62.  
  63.     for (int i = 0; i < k; ++i)
  64.     {
  65.         DFA[terminals[i]].isterminal = true;
  66.     }
  67.  
  68.  
  69.     for (int i = 0; i < n * l; ++i)
  70.     {
  71.         cin >> u >> c >> v;
  72.         // DFA.addEdge(u,v,c, DFA);
  73.         addEdge(u, v, c, DFA);
  74.  
  75.         //Запоминаю алфавит автоматов
  76.         c_idx = int(c) - 97;
  77.         if (indicators[c_idx] == 0)
  78.         {
  79.             alphabet.push_back(c);
  80.             indicators[c_idx] = 1;
  81.         }
  82.         else
  83.             indicators[c_idx] = 1;
  84.     }
  85.  
  86.     return;
  87. }
  88.  
  89.  
  90. void display(struct vertex* DFA, int n)
  91. {
  92.     cout << "\n print:" << endl;
  93.     for (int i = 0; i < n; i++)
  94.     {
  95.         cout << "vertex: " << i << " ";
  96.         if (DFA[i].isterminal)
  97.             cout << "isterminal"
  98.                  << " ";
  99.  
  100.         cout << "adj_vertexes: ";
  101.         for (int j = 0; j < 26; ++j)
  102.         {
  103.             if (DFA[i].is_exist[j] == true)
  104.                 std::cout << "(" << char(j + 97) << "," << DFA[i].adj_list[j] << "); ";
  105.         }
  106.         cout << endl;
  107.     }
  108. }
  109.  
  110. void clean_DFA(struct vertex* DFA, int n)
  111. {
  112.     for (int i = 0; i < n; i++)
  113.     {
  114.         DFA[i].isterminal = false;
  115.         DFA[i].list_size = 0;
  116.  
  117.         for (int j = 0; j < 26; ++j)
  118.         {
  119.             DFA[i].adj_list[j] = -1;   //Эта строчка ломает код
  120.             DFA[i].is_exist[j] = false;
  121.         }
  122.     }
  123. }
  124.  
  125. void clean_DFA2(struct vertex_2* DFA, int n)
  126. {
  127.     for (int i = 0; i < n; i++)
  128.     {
  129.         DFA[i].isterminal = false;
  130.         //DFA[i].list_size = 0;
  131.  
  132.         for (int j = 0; j < 26; ++j)
  133.         {
  134.             DFA[i].is_exist[j] = false;
  135.         }
  136.     }
  137. }
  138.  
  139. void display2(struct vertex_2* DFA, int n)
  140. {
  141.     cout << "\n print:" << endl;
  142.     for (int i = 0; i < n; i++)
  143.     {
  144.         cout << "vertex: (" << DFA[i].u << "," << DFA[i].v << ") ";
  145.         if (DFA[i].isterminal)
  146.             cout << "(isterminal)" << " ";
  147.  
  148.         cout << "adj_vertexes: ";
  149.         for (int j = 0; j < 26; ++j)
  150.         {
  151.             if (DFA[i].is_exist[j] == true)
  152.                 std::cout << char(j + 97) << "->(" << DFA[i].adj_list[j].a << "," << DFA[i].adj_list[j].b <<  "); ";
  153.         }
  154.         cout << endl;
  155.     }
  156. }
  157.  
  158. void cartesian_product(struct vertex_2* dec_graph, struct vertex* DFA1, struct vertex* DFA2, int n1, int n2)
  159. {
  160.    
  161.     int v1,v2;
  162.     int number_in_array;
  163.     int N = n1*n2;
  164.     vertex_2 buff;
  165.     struct my_pair dec_ver;
  166.  
  167.     clean_DFA2(dec_graph, N);
  168.    
  169.     for (int i =0; i < n1; ++i)
  170.     {
  171.         for (int j =0; j < n2; ++j)
  172.         {
  173.             buff.u = i;
  174.             buff.v = j;
  175.             buff.isterminal = (DFA1[i].isterminal != DFA2[j].isterminal);
  176.             buff.number_in_array = i*n2+j;
  177.            
  178.             for (int k = 0; k < 26; ++k)
  179.             {
  180.                 if (DFA1[i].is_exist[k] && DFA2[j].is_exist[k])
  181.                 {
  182.                     dec_ver.a = DFA1[i].adj_list[k]; //Куда переходит авт1 по символу c
  183.                     dec_ver.b = DFA2[j].adj_list[k]; //Куда переходит авт2 по символу c
  184.                     buff.adj_list[k] = dec_ver; //по этой штуке понятно к кому обращаться при обходе
  185.                     buff.is_exist[k] = true;
  186.                 }
  187.                 else
  188.                 {
  189.                     dec_graph[i*n2+j].is_exist[k] = false;
  190.                 }
  191.             }
  192.            
  193.             dec_graph[i*n2+j] = buff;
  194.         }
  195.     }
  196. }
  197.  
  198. int main()
  199. {
  200.     // n — колво состояний.  k — колво терминальных состояний.  l — колво букв в алфавите.
  201.     int n1, k1, l1;
  202.     vector<char> alphabet1;
  203.     int n2, k2, l2;
  204.     vector<char> alphabet2;
  205.     cin >> n1 >> k1 >> l1;
  206.     vertex DFA1[n1];
  207.     clean_DFA(DFA1, n1);
  208.     Fill_DFA(n1, k1, l1, alphabet1, DFA1);
  209.  
  210.  
  211.     cin >> n2 >> k2 >> l2;
  212.     vertex DFA2[n2];
  213.     clean_DFA(DFA2, n2);
  214.     Fill_DFA(n2, k2, l2, alphabet2, DFA2);
  215.  
  216.  
  217.    
  218.     //int v1,v2;
  219.     //int number_in_array;
  220.  
  221.     int N = n1*n2;
  222.     struct vertex_2 dec_graph[N];
  223.     cartesian_product(dec_graph, DFA1, DFA2, n1, n2);
  224.     /*
  225.     vertex_2 buff;
  226.     struct my_pair dec_ver;
  227.     cout << " start2" << endl;
  228.     clean_DFA2(dec_graph, N);
  229.     for (int i =0; i < n1; ++i)
  230.     {
  231.         for (int j =0; j < n2; ++j)
  232.         {
  233.             buff.u = i;
  234.             buff.v = j;
  235.             buff.isterminal = (DFA1[i].isterminal != DFA2[j].isterminal);
  236.             buff.number_in_array = i*n2+j;
  237.            
  238.             for (int k = 0; k < 26; ++k)
  239.             {
  240.                 if (DFA1[i].is_exist[k] && DFA2[j].is_exist[k])
  241.                 {
  242.                     dec_ver.a = DFA1[i].adj_list[k]; //Куда переходит авт1 по символу c
  243.                     dec_ver.b = DFA2[j].adj_list[k]; //Куда переходит авт2 по символу c
  244.                     buff.adj_list[k] = dec_ver; //по этой штуке понятно к кому обращаться при обходе
  245.                     buff.is_exist[k] = true;
  246.                 }
  247.                 else
  248.                 {
  249.                     dec_graph[i*n2+j].is_exist[k] = false;
  250.                 }
  251.             }
  252.            
  253.             dec_graph[i*n2+j] = buff;
  254.         }
  255.     }
  256.     */
  257.     display(DFA1, n1);
  258.     display(DFA2, n2);
  259.    
  260.     display2(dec_graph, N);
  261.  
  262.     return 0;
  263. }
  264.  
Advertisement
Add Comment
Please, Sign In to add comment