Вступить в клуб →
лёгкаявопросГрафы и обходы

BFS с пометкой посещения при извлечении: что именно ломается

from collections import deque


def bfs(graph, start):
    order = []
    q = deque([start])
    visited = set()
    while q:
        node = q.popleft()
        if node in visited:
            continue
        visited.add(node)
        order.append(node)
        for nxt in graph[node]:
            q.append(nxt)
    return order

Вершина помечается посещённой в момент извлечения из очереди, а не в момент добавления. Что это меняет?

  • Обход зациклится, если в графе есть цикл: вершина будет добавляться в очередь бесконечно
  • Нужно заменить deque на обычный list, иначе popleft на длинной очереди работает за линейное время
  • Порядок обхода станет неверным: BFS требует пометки именно в момент добавления в очередь
  • Порядок верный, но вершина попадает в очередь по разу на каждое входящее ребро — память до O(E)

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела