O_Egor

DFS

Oct 11th, 2022
768
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int dfs(const vector<vector<bool>>& g, vector <bool>& used, int v)//передаем в параметры сам граф (матрицу смежности), вектор посещённых вершин и саму вершину
  7. {
  8.     int cnt = 0;//счётчик для подсчёта кол-ва вершин, в которые мы можем попасть из вершины v
  9.     if (used[v])//если мы уже были в этой вершине, то не считаем её
  10.         return -1;//возвращаем -1
  11.     used[v] = true;//помечаем вершину v, что мы её посещали
  12.     for (size_t i = 0; i < g.size(); ++i)//пробегаемся по всем вершинам, чтобы найти, пометить и посчитать те, в которые мы можем попасть
  13.     {
  14.         if (g[v][i] && !used[i])//проверяем, есть ли путь из v в i, и не были ли мы уже в i
  15.         {
  16.             ++cnt;//считаем такую вершину
  17.             cnt += dfs(g, used, i);//и запускаемся дальше, для подсчёта всех вершин, в которые мы можем попасть из i-той
  18.         }
  19.        
  20.     }
  21.     return cnt; //вовзвращаем такое кол-во
  22. }
  23.  
  24. int main()
  25. {
  26.     int n, e; //n - количество вершин в графе, e - количество рёбер
  27.     cin >> n >> e;
  28.     vector<vector <bool>> g(n, vector <bool>(n, false)); //Матрица смежности для хранения графа размером NxN, изначально заполнена нулями
  29.     vector <bool> used (n, 0); //вектор, в котором мы помечаем посещённые вершины
  30.     for (int i = 0; i < e; ++i) //здесь мы заполняем нашу матрицу смежности
  31.     {
  32.         int a, b;
  33.         cin >> a >> b; //считываем вершины, между котороыми есть ребро
  34.         a--;//отнимаем по еденице, так как индексы с нуля
  35.         b--;//тут тоже самое
  36.         g[a][b] = 1;//Ставим единичку, чтобы показать, что из "а" есть путь в "b"
  37.         g[b][a] = 1;//Тоже самое, но наоборот
  38.     }
  39.  
  40.     int ans(0);//Счётчик для подсчёта компонентов
  41.     vector <int> components;//вектор для хранения размеров компонент
  42.     for (int i = 0; i < n; ++i)//бежим по всем вершинам
  43.     {
  44.         int k = dfs(g, used, i);//запускаемся от первой вершины и считаем во сколько вершин мы можем попасть из неё. (описание dfs выше)
  45.         if (k >= 0)//если кол-во вершин, в которые мы можем попасть из i-той вершины больше равно нуля, то это очередной компонент графа
  46.         {
  47.             ++ans;//считаем кол-во компонентов
  48.             components.push_back(k + 1);//добавляем размер этого компонента (+1 делается для того, чтобы добавить саму стартовую вершину
  49.         }
  50.     }
  51.     cout << "Amount of components: " << ans << ": \n"; //стандартный вывод
  52.     for (const auto& i : components)
  53.         cout << i << ' ';
  54.  
  55.     return 0;
  56. }
  57. //Дальше примеры
  58. //Пример 1: ответ должен быть 3 => [3 2 5]
  59. /*
  60. 10 7
  61. 1 2
  62. 1 3
  63. 4 5
  64. 6 7
  65. 7 8
  66. 7 9
  67. 7 10
  68. */
  69. //Пример 2: ответ должен быть 3 => [1 1 1]
  70. /*
  71. 3 0
  72. */
  73.  
  74. //Пример 3: ответ должен быть 2 => [3, 2]
  75. /*
  76. 5 4
  77. 1 2
  78. 2 3
  79. 3 1
  80. 4 5
  81. */
Advertisement
Add Comment
Please, Sign In to add comment