Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <map>
- using namespace std;
- struct vertex
- {
- bool isterminal = false;
- map<char,int> adj_list;
- int list_size = 0;
- int number_vertex;
- };
- struct vertex_2
- {
- int u;
- int v;
- bool isterminal = false;
- bool isvisited = false;
- };
- struct adj_vertex
- {
- int number_vertex;
- char symbol;
- };
- class Graph
- {
- struct vertex* graph;
- int count_edges;
- int count_vertex;
- public:
- Graph(int count_vertex, int* terminals, int k);
- void addEdge(int i, int j, char symbol);
- bool is_terminal(int number_vertex);
- int to_vertex(int i, char c);
- void display();
- };
- Graph::Graph(int count_vertex, int* terminals, int k)
- {
- graph = new vertex[count_vertex];
- this->count_edges = 0;
- this->count_vertex = count_vertex;
- for (int i = 0; i < k; ++i)
- {
- graph[terminals[i]].isterminal = true;
- }
- }
- void Graph::addEdge(int i, int j, char symbol)
- {
- graph[i].adj_list[symbol] = j;
- graph[i].list_size++;
- }
- bool Graph::is_terminal(int number_vertex)
- {
- return graph[number_vertex].isterminal;
- }
- int Graph::to_vertex(int i, char c)
- {
- return graph[i].adj_list[c];
- }
- void Graph::display()
- {
- cout << "\n print:" << endl;
- for (int i = 0; i < this->count_vertex; i++)
- {
- cout << "vertex: " << i << " ";
- if (graph[i].isterminal) cout << "isterminal" << " ";
- int size = graph[i].adj_list.size();
- cout << "adj_vertexes: ";
- for(const auto& elem : graph[i].adj_list)
- {
- std::cout << "(" << elem.first << "," << elem.second << ")" << "; ";
- }
- cout << endl;
- }
- }
- Graph ReadDFA(int n, int k, int l, vector<char>& alphabet)
- {
- int u,v, c_idx;
- char c;
- int terminals[k];
- int indicators[26] = {0};
- //vector<char> alphabet;
- for (int i = 0; i < k; ++i)
- cin >> terminals[i];
- Graph DFA(n,terminals,k);
- for (int i = 0; i < n*l; ++i)
- {
- cin >> u >> c >> v;
- DFA.addEdge(u,v,c);
- //Запоминаю алфавит автоматов
- c_idx = int(c)-97;
- if (indicators[c_idx] == 0)
- {
- alphabet.push_back(c);
- indicators[c_idx] = 1;
- }
- else
- indicators[c_idx] = 1;
- }
- return DFA;
- }
- int main()
- {
- //int a[3] = {1,2,3};
- //Graph g(5,a,3);
- //g.addEdge(1,2,'c');
- //g.display();
- int n1, k1, l1; //n — колво состояний. k — колво терминальных состояний. l — колво букв в алфавите.
- int n2, k2, l2;
- vector<char> alphabet1;
- vector<char> alphabet2;
- cin >> n1 >> k1 >> l1;
- Graph DFA1 = ReadDFA(n1, k1, l1, alphabet1);
- cin >> n2 >> k2 >> l2;
- Graph DFA2 = ReadDFA(n2, k2, l2, alphabet2);
- DFA1.display();
- DFA2.display();
- /*
- (i,j)
- 1. Передаю индекс вершины и символ с, возвращает номер вершины в которую идет по нему
- 2. Передаю индекс вершины, говорит термниальная или нет
- vertex_2 buff;
- for (int i = 0; i < n1; ++i)
- {
- for (int j = 0; j < n2; ++j)
- {
- buff.u = i;
- buff.v = j;
- DFA1.to_vertex(i, c)
- }
- }
- */
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement