Advertisement
vadimk772336

Untitled

Mar 13th, 2022
837
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 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.     map<char,int> adj_list;
  11.     int list_size = 0;
  12.     int number_vertex;
  13.    
  14. };
  15.  
  16. struct vertex_2
  17. {
  18.     int u;
  19.     int v;
  20.     bool isterminal = false;
  21.     bool isvisited = false;
  22. };
  23.  
  24. struct adj_vertex
  25. {
  26.     int number_vertex;
  27.     char symbol;
  28. };
  29.  
  30. class Graph
  31. {
  32.     struct vertex* graph;
  33.     int count_edges;
  34.     int count_vertex;
  35.  
  36. public:
  37.     Graph(int count_vertex, int* terminals, int k);
  38.     void addEdge(int i, int j, char symbol);
  39.     bool is_terminal(int number_vertex);
  40.     int to_vertex(int i, char c);
  41.     void display();
  42. };
  43.  
  44. Graph::Graph(int count_vertex, int* terminals, int k)
  45. {
  46.     graph = new vertex[count_vertex];
  47.     this->count_edges = 0;
  48.     this->count_vertex = count_vertex;
  49.    
  50.     for (int i = 0; i < k; ++i)
  51.     {
  52.         graph[terminals[i]].isterminal = true;
  53.     }
  54. }
  55.  
  56. void Graph::addEdge(int i, int j, char symbol)
  57. {
  58.     graph[i].adj_list[symbol] = j;
  59.     graph[i].list_size++;
  60.  
  61. }
  62.  
  63. bool Graph::is_terminal(int number_vertex)
  64. {
  65.     return graph[number_vertex].isterminal;
  66. }
  67.  
  68. int Graph::to_vertex(int i, char c)
  69. {
  70.     return graph[i].adj_list[c];
  71. }
  72.  
  73. void Graph::display()
  74. {
  75.     cout << "\n print:" << endl;
  76.     for (int i = 0; i < this->count_vertex; i++)
  77.     {
  78.         cout << "vertex: " << i << " ";
  79.         if (graph[i].isterminal) cout << "isterminal" << " ";
  80.         int size = graph[i].adj_list.size();
  81.         cout << "adj_vertexes: ";
  82.  
  83.         for(const auto& elem : graph[i].adj_list)
  84.         {
  85.            std::cout << "(" << elem.first << "," << elem.second << ")" << "; ";
  86.         }
  87.         cout << endl;
  88.     }
  89. }
  90.  
  91.  
  92. Graph ReadDFA(int n, int k, int l, vector<char>& alphabet)
  93. {
  94.     int u,v, c_idx;
  95.     char c;
  96.     int terminals[k];
  97.    
  98.     int indicators[26] = {0};
  99.     //vector<char> alphabet;
  100.    
  101.    
  102.     for (int i = 0; i < k; ++i)
  103.         cin >> terminals[i];
  104.    
  105.     Graph DFA(n,terminals,k);
  106.     for (int i = 0; i < n*l; ++i)
  107.     {
  108.         cin >> u >> c >> v;
  109.         DFA.addEdge(u,v,c);
  110.        
  111.         //Запоминаю алфавит автоматов
  112.         c_idx = int(c)-97;
  113.         if (indicators[c_idx] == 0)
  114.         {
  115.             alphabet.push_back(c);
  116.             indicators[c_idx] = 1;
  117.         }
  118.         else
  119.             indicators[c_idx] = 1;
  120.        
  121.     }
  122.    
  123.     return DFA;
  124. }
  125.  
  126. int main()
  127. {
  128.  
  129.     //int a[3] = {1,2,3};
  130.     //Graph g(5,a,3);
  131.     //g.addEdge(1,2,'c');
  132.     //g.display();
  133.  
  134.     int n1, k1, l1; //n — колво состояний.  k — колво терминальных состояний.  l — колво букв в алфавите.
  135.     int n2, k2, l2;
  136.     vector<char> alphabet1;
  137.     vector<char> alphabet2;
  138.  
  139.     cin >> n1 >> k1 >> l1;
  140.     Graph DFA1 = ReadDFA(n1, k1, l1, alphabet1);
  141.    
  142.     cin >> n2 >> k2 >> l2;
  143.     Graph DFA2 = ReadDFA(n2, k2, l2, alphabet2);
  144.    
  145.     DFA1.display();
  146.     DFA2.display();
  147.    
  148.    /*
  149.    
  150.    (i,j)
  151.    1. Передаю индекс вершины и символ с, возвращает номер вершины в которую идет по нему
  152.    2. Передаю индекс вершины, говорит термниальная или нет
  153.    vertex_2 buff;
  154.    for (int i = 0; i < n1; ++i)
  155.    {
  156.        for (int j = 0; j < n2; ++j)
  157.        {
  158.             buff.u = i;
  159.             buff.v = j;
  160.             DFA1.to_vertex(i, c)
  161.        }
  162.    }
  163.    
  164.    */
  165.    
  166.  
  167.  
  168.     return 0;
  169. }
  170.  
  171.  
  172.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement