Обходы графа: в глубину и в ширину

Пошаговая анимация обхода неориентированного графа. Видно, как накапливается стек для DFS и очередь для BFS, и в каком порядке посещаются вершины.

DFS BFS Стек и очередь Матрица смежности

Управление

Посещено
0
Шагов
0
В структуре
0

Граф

Структура данных

Стек пуст

Порядок посещения

—

Нажмите «Запустить» или «Шаг», чтобы начать обход.

Матрица смежности

Граф неориентированный, поэтому матрица симметрична: a[i][j] = a[j][i]. Единица означает наличие ребра между вершинами i и j.

Ключевой код

Обход в глубину (итеративный, со стеком)
void DFS(int a[][N], int v) {
  int st[N], r[N] = {0};   // st — стек, r — пометки
  int k = 0;                // указатель вершины стека
  st[k] = v;
  r[v] = 1;
  cout << "Посетили " << v+1 << endl;
  while (k != -1) {
    int found = -1;
    for (int j = 0; j < N; j++)
      if (a[st[k]][j] && !r[j]) { found = j; break; }
    if (found != -1) {
      r[found] = 1;
      st[++k] = found;
      cout << "Посетили " << found+1 << endl;
    } else {
      k--;                   // откат: из этой вершины пути нет
    }
  }
}
Обход в ширину (очередь)
void BFS(int a[][N], int v) {
  int q[N], head = 0, tail = 0, r[N] = {0};
  q[tail++] = v;
  r[v] = 1;
  while (head < tail) {
    int u = q[head++];
    cout << "Посетили " << u+1 << endl;
    for (int j = 0; j < N; j++)
      if (a[u][j] && !r[j]) {
        r[j] = 1;
        q[tail++] = j;
      }
  }
}
Разница на практике. DFS уходит вглубь по первой попавшейся ветке, BFS волной расходится от стартовой вершины. Для поиска кратчайшего пути в невзвешенном графе нужен именно BFS.

Задание

  1. Запустите DFS и BFS из одной и той же вершины. Сравните порядок посещения.
  2. Запустите обход из разных вершин. Всегда ли посещаются все вершины графа?
  3. Добавьте в граф «мост» — ребро, удаление которого разъединяет граф. Как это повлияет на обход из вершины 0?
  4. Модифицируйте алгоритм так, чтобы он запоминал предшественника каждой вершины и умел восстанавливать путь от корня.
  5. Реализуйте рекурсивный DFS и сравните его с итеративным.