vadimk772336

без указателя

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