Sanlover

bfs

Jun 28th, 2021 (edited)
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const int n = 4;
  5.  
  6. //матрица смежности графа
  7. int GM[n][n] =
  8. {
  9. {0, 1, 1, 0},
  10. {0, 0, 1, 1},
  11. {1, 0, 0, 1},
  12. {0, 1, 0, 0}
  13. };
  14.  
  15. //поиск в ширину
  16. // unit - номер графа с которого начинаем обход
  17. // visited - массив, где индекс - номер узла, а значение - посещали или нет этот узел
  18. void BFS(bool* visited, int unit)
  19. {
  20.     // Очередь в которой будут хранится индексы тех, кого будем посещать
  21.     int* queue = new int[n];
  22.    
  23.    
  24.     int count, head;
  25.  
  26.     for (int i = 0; i < n; i++)
  27.         queue[i] = 0;
  28.  
  29.     // количество тех, что надо пройти
  30.     count = 0;
  31.     // номер того, по которому идём (исключителньо итерационный номер)
  32.     head = 0;
  33.  
  34.     // Первый в очереди - тот, с которого начинаем обход (параметр функции)
  35.     queue[count] = unit;
  36.     // Прибавляем 1 к количеству тех, которые надо пройти
  37.     count++;
  38.     // Говорим, что мы по факту посетили 1й узел
  39.     visited[unit] = true;
  40.  
  41.     // Пока текущий посещённый меньше чем количество тех, что надо посетить
  42.     while (head < count)
  43.     {
  44.         // Присваем значение в очереди по текущему номеру
  45.         unit = queue[head];
  46.         // переходим на следующий номер
  47.         head++;
  48.         // Выводим значение (номер узла) + 1 ( для красоты *исключить нумерацию с 0*)
  49.         cout << unit + 1 << " ";
  50.         // Идём по строчке с номером полученным из очереди
  51.         for (int i = 0; i < n; i++){
  52.             // Если у узла есть связь с другим узлом ( != 0 ) и он ещё не посещался ( visited = false)
  53.             if (GM[unit][i] != 0 &&  visited[i] == false)
  54.             {
  55.                 // добавляем его в очередь
  56.                 queue[count] = i;
  57.                 // Увеличиваем количество тех, что нужно пройти
  58.                 count++;
  59.                 // И говорим, что посетим (ли)
  60.                 visited[i] = true;
  61.             }
  62.         }
  63.     }
  64.     // удаляем массив
  65.     delete[] queue;
  66. }
  67.  
  68. int main()
  69. {
  70.     setlocale(LC_ALL, "Rus");
  71.  
  72.     int start;
  73.     cout << "Стартовая вершина >> ";
  74.     cin >> start;
  75.  
  76.     bool* visited = new bool[n];
  77.  
  78.     cout << "Матрица смежности графа: " << endl;
  79.     for (int i = 0; i < n; i++)
  80.     {
  81.         visited[i] = false;
  82.         for (int j = 0; j < n; j++)
  83.             cout << " " << GM[i][j];
  84.         cout << endl;
  85.     }
  86.  
  87.     cout << "Порядок обхода: ";
  88.     BFS(visited, start - 1);
  89.  
  90.     delete[]visited;
  91.  
  92.     return 0;
  93. }
Add Comment
Please, Sign In to add comment