vadimk772336

граф работает

Nov 24th, 2021 (edited)
1,154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdlib>
  4. #include <list>
  5. using namespace std;
  6.  
  7. const int p = 2000000033;
  8. const int c = 3;
  9.  
  10. struct vertex
  11. {
  12.     bool visited = false;
  13.     vector<struct adj_vertex> adj_list;
  14.     int list_size = 0;
  15.     int label = -1;
  16. };
  17.  
  18. struct adj_vertex
  19. {
  20.     int idx;
  21.     int edge_value;
  22. };
  23.  
  24. class Graph
  25. {
  26.     vertex* G;
  27.     int size;
  28.  
  29. public:
  30.     Graph(int n);
  31.     int get_size();
  32.     void addEdge(int i, int j, int key);
  33.     void print_graph();
  34.     void DFS(int v_idx, int value, bool& flag);
  35.     bool is_correct();
  36. };
  37.  
  38. Graph::Graph(int n)
  39. {
  40.     G = new vertex[n];
  41.     size = n;
  42. }
  43.  
  44. int Graph::get_size()
  45. {
  46.     return this->size;
  47. }
  48.  
  49. void Graph::addEdge(int i, int j, int key)
  50. {
  51.  
  52.     adj_vertex tmp;
  53.     tmp.idx = j;
  54.     tmp.edge_value = key;
  55.  
  56.     G[i].adj_list.push_back(tmp);
  57.  
  58.     tmp.idx = i;
  59.     G[j].adj_list.push_back(tmp);
  60.  
  61.     G[i].list_size++;
  62.     G[j].list_size++;
  63. }
  64.  
  65.  
  66. void Graph::print_graph()
  67. {
  68.     cout << "\n print:" << endl;
  69.     for (int i = 0; i < size; i++)
  70.     {
  71.         cout << "visited = " << G[i].visited << "; i= " << i << "; ";
  72.         cout << " label = " << G[i].label << " : ";
  73.         int size = G[i].adj_list.size();
  74.  
  75.         cout << "idx =: ";
  76.         for (int j = 0; j < size; ++j)
  77.         {
  78.             cout << G[i].adj_list[j].idx << " ";
  79.         }
  80.  
  81.  
  82.         cout << ";   edge_value =: ";
  83.         for (int j = 0; j < size; ++j)
  84.         {
  85.             cout << G[i].adj_list[j].edge_value << " ";
  86.         }
  87.         cout << endl;
  88.     }
  89. }
  90.  
  91. void Graph::DFS(int v_idx, int value, bool& flag) //мб лучше не по указателю по индексу
  92. {
  93.  
  94.     if (flag)
  95.     {
  96.         G[v_idx].visited = true;
  97.         G[v_idx].label = value;
  98.  
  99.         vertex u;
  100.         vector<struct adj_vertex> curr_list = G[v_idx].adj_list;
  101.         int u_idx, val, edge_value;
  102.  
  103.         for (int i = 0; i < G[v_idx].list_size; ++i)
  104.         {
  105.  
  106.             u_idx = curr_list[i].idx;
  107.             u = G[u_idx];
  108.             edge_value = curr_list[i].edge_value;
  109.  
  110.             if (!(u.visited))
  111.             {
  112.                 val = edge_value - value;
  113.                 DFS(u_idx, val, flag);
  114.             }
  115.  
  116.             if (G[u_idx].label + G[v_idx].label != edge_value)
  117.             {
  118.                 flag = false;
  119.             }
  120.         }
  121.     }
  122. }
  123.  
  124.  
  125. bool Graph::is_correct()
  126. {
  127.  
  128.     bool flag = true;
  129.     for (int i = 0; i < this->size; ++i)
  130.     {
  131.         if (!G[i].visited)
  132.             DFS(i, 0, flag);
  133.         if (!flag)
  134.             return false;
  135.     }
  136.     return true;
  137. }
  138.  
  139. int main()
  140. {
  141.  
  142.     Graph g(12);
  143.  
  144.     g.addEdge(0, 1, 5);
  145.     g.addEdge(1, 2, 4);
  146.     g.addEdge(3, 4, 3);
  147.     g.addEdge(5, 6, 5);
  148.     g.addEdge(6, 7, 6);
  149.     g.addEdge(7, 8, 7);
  150.     g.addEdge(7, 11, 3);
  151.     g.addEdge(7, 9, 2);
  152.     g.addEdge(9, 10, 1);
  153.  
  154.     cout << g.is_correct() << endl;
  155.  
  156.     // g.print_graph();
  157.  
  158.     return 0;
  159. }
  160.  
Add Comment
Please, Sign In to add comment