Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cstdlib>
- #include <list>
- using namespace std;
- const int p = 2000000033;
- const int c = 3;
- struct vertex
- {
- bool visited = false;
- vector<struct adj_vertex> adj_list;
- int list_size = 0;
- int label = -1;
- };
- struct adj_vertex
- {
- int idx;
- int edge_value;
- };
- class Graph
- {
- vertex* G;
- int size;
- public:
- Graph(int n);
- int get_size();
- void addEdge(int i, int j, int key);
- void print_graph();
- void DFS(int v_idx, int value, bool& flag);
- bool is_correct();
- };
- Graph::Graph(int n)
- {
- G = new vertex[n];
- size = n;
- }
- int Graph::get_size()
- {
- return this->size;
- }
- void Graph::addEdge(int i, int j, int key)
- {
- adj_vertex tmp;
- tmp.idx = j;
- tmp.edge_value = key;
- G[i].adj_list.push_back(tmp);
- tmp.idx = i;
- G[j].adj_list.push_back(tmp);
- G[i].list_size++;
- G[j].list_size++;
- }
- void Graph::print_graph()
- {
- cout << "\n print:" << endl;
- for (int i = 0; i < size; i++)
- {
- cout << "visited = " << G[i].visited << "; i= " << i << "; ";
- cout << " label = " << G[i].label << " : ";
- int size = G[i].adj_list.size();
- cout << "idx =: ";
- for (int j = 0; j < size; ++j)
- {
- cout << G[i].adj_list[j].idx << " ";
- }
- cout << "; edge_value =: ";
- for (int j = 0; j < size; ++j)
- {
- cout << G[i].adj_list[j].edge_value << " ";
- }
- cout << endl;
- }
- }
- void Graph::DFS(int v_idx, int value, bool& flag) //мб лучше не по указателю по индексу
- {
- if (flag)
- {
- G[v_idx].visited = true;
- G[v_idx].label = value;
- vertex u;
- vector<struct adj_vertex> curr_list = G[v_idx].adj_list;
- int u_idx, val, edge_value;
- for (int i = 0; i < G[v_idx].list_size; ++i)
- {
- u_idx = curr_list[i].idx;
- u = G[u_idx];
- edge_value = curr_list[i].edge_value;
- if (!(u.visited))
- {
- val = edge_value - value;
- DFS(u_idx, val, flag);
- }
- if (G[u_idx].label + G[v_idx].label != edge_value)
- {
- flag = false;
- }
- }
- }
- }
- bool Graph::is_correct()
- {
- bool flag = true;
- for (int i = 0; i < this->size; ++i)
- {
- if (!G[i].visited)
- DFS(i, 0, flag);
- if (!flag)
- return false;
- }
- return true;
- }
- int main()
- {
- Graph g(12);
- g.addEdge(0, 1, 5);
- g.addEdge(1, 2, 4);
- g.addEdge(3, 4, 3);
- g.addEdge(5, 6, 5);
- g.addEdge(6, 7, 6);
- g.addEdge(7, 8, 7);
- g.addEdge(7, 11, 3);
- g.addEdge(7, 9, 2);
- g.addEdge(9, 10, 1);
- cout << g.is_correct() << endl;
- // g.print_graph();
- return 0;
- }
Add Comment
Please, Sign In to add comment