Advertisement
allia

BFS более лучше

Jan 9th, 2021
944
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. /*за помощь в разборе задачи и объяснение несколько иного, чем у меня в задаче 196, подхода, спасибо Максиму Ткачеву)*/
  2.  
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. class vershina
  7. {
  8. public:
  9. vershina* next;
  10. vershina* prev;
  11.     int number;
  12.     int way;
  13.     vershina (int number, int way = 0, vershina* prev = nullptr)
  14.     {
  15.         this->number = number;
  16.         this->way = way;
  17.         this->next = nullptr;
  18.         this->prev = prev;
  19.     }
  20. };
  21.  
  22. class queue
  23. {
  24.   public:
  25.     queue()
  26.     {
  27.         size = 0;
  28.         head = nullptr;
  29.         tail = nullptr;
  30.     }
  31.  
  32.     vershina* head;
  33.     vershina* tail;
  34.     int size;
  35.  
  36. public:
  37.     void push_back(int number, int way = 0, vershina* prev = nullptr)
  38.     {
  39.         vershina* yzel = new vershina(number, way, prev);
  40.         if (head == nullptr)
  41.         {
  42.             head = yzel;
  43.             tail = yzel;
  44.         }
  45.         else
  46.         {
  47.             tail->next = yzel;
  48.             tail = yzel;
  49.         }
  50.         size++;
  51.     }
  52.    
  53.     void print()
  54.     {
  55.         vershina* current = this->head;
  56.         for (int i = 0; i < size; i++)
  57.         {
  58.             cout << current->number << " ";
  59.             current = current->next;
  60.         }
  61.     }
  62.    
  63.     vershina* pop_front()
  64.     {
  65.         if (size == 0)
  66.             return 0;
  67.  
  68.         vershina* result = head;
  69.         head = head->next;
  70.         size--;
  71.         return result;
  72.     }
  73.  
  74.     int GetSize()
  75.     {
  76.         return size;
  77.     }
  78. };
  79.  
  80.  
  81. class Graph
  82. {
  83. public:
  84.     int n;
  85.     bool** arr;
  86.     Graph(int x)
  87.     {
  88.         n = x;
  89.         arr = new bool*[n]{0};
  90.  
  91.         for (int i = 0; i < n; i++)
  92.             arr[i] = new bool[n]{};
  93.     }
  94.  
  95.     void new_rebro (int i, int j)
  96.     {
  97.         arr[i][j] = 1;
  98.     }
  99.  
  100.     void BFS(int start, int finish)
  101.     {
  102.         if (start == finish)
  103.         {
  104.             cout << 0;
  105.             return;
  106.         }
  107.  
  108.         queue Q;
  109.         vershina* current = new vershina(start);
  110.  
  111.         for (int i = 0; i < n; i++)
  112.             if (arr[start-1][i] == 1)
  113.                 Q.push_back(i+1, 1, current);
  114.  
  115.         while (Q.GetSize() != 0)
  116.         {
  117.             current = Q.pop_front();
  118.             if (current->number == finish)
  119.             {
  120.                 cout << current->way << endl;
  121.                 all_way(current, start, current->way);
  122.                 return;
  123.             }
  124.             else
  125.                 for (int i = 0; i < n; i++)
  126.                     if (arr[current->number - 1][i] == 1)
  127.                         Q.push_back(i + 1, current->way + 1, current);
  128.         }
  129.         cout << -1;
  130.         return;
  131.     }
  132.  
  133.     void all_way(vershina* start, int stop, int way)
  134.     {
  135.         int* path = new int[way + 1];
  136.         vershina* current = start;
  137.         int i = 0;
  138.  
  139.         while (current->number != stop)
  140.         {
  141.             path[i] = current->number;
  142.             current = current->prev;
  143.             i++;
  144.         }
  145.  
  146.         path[way] = stop;
  147.  
  148.         for (int i = way; i >= 0; i--)
  149.             cout << path[i] << " ";
  150.     }
  151. };
  152.  
  153. int main()
  154. {
  155.     int n, element, start, finish;
  156.     cin >> n;
  157.  
  158.     Graph object(n);
  159.  
  160.     for (int i = 0; i < n; i++)
  161.         for (int j = 0; j < n; j++)
  162.         {
  163.             cin >> element;
  164.             if (element == 1)
  165.                 object.new_rebro(i, j);
  166.         }
  167.  
  168.   cin >> start >> finish;
  169.     object.BFS(start, finish);
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement