0Pricing
Competitive Programming Academy · Урок

0-1 BFS с деком

Находите кратчайшие пути при весах 0 или 1

«0-1 BFS с деком» — бесплатный урок Competitive Programming Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Competitive Programming Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Competitive Programming Academy содержит 4 уроков всего.

Особый вид графа

В некоторых графах веса рёбер равны только 0 или 1. Для них существует более простой и быстрый приём, чем алгоритм Дейкстры.

Знакомьтесь: 0-1 BFS

0-1 BFS находит кратчайшие пути в графах с весами 0 и 1 за линейное время, без кучи и множителя log.

Инструмент: дек

Замените кучу на дек — очередь, в которую можно добавлять элементы и из которой можно извлекать их с обоих концов.

from collections import deque
dq = deque([src])

Главная идея

Ребро с весом 0 сохраняет то же расстояние, а ребро с весом 1 добавляет единицу. Дек поддерживает обе группы в нужном порядке.

Нулевые рёбра — в начало

Перешли по ребру с весом 0? Используйте appendleft, чтобы добавить соседнюю вершину в начало: дополнительная стоимость отсутствует.

dq.appendleft(v)

Рёбра с весом 1 — в конец

Перешли по ребру с весом 1? Используйте append, чтобы добавить соседнюю вершину в конец: она находится на один слой дальше от исходной вершины.

dq.append(v)

Извлекайте из начала

Всегда используйте popleft для извлечения текущей вершины. Так дек остаётся отсортированным по расстоянию, как при послойном обходе BFS.

u = dq.popleft()

Выполняйте релаксацию с учётом веса

Расслабьте каждое ребро: новое расстояние равно dist[u] плюс вес ребра, после чего добавьте вершину в начало или конец в зависимости от этого веса.

nd = dist[u] + w
if nd < dist[v]:
    dist[v] = nd

Почему порядок сохраняется

В деке одновременно находятся не более двух различных расстояний. Именно этот инвариант объясняет, почему добавление в начало и конец работает.

Линейная скорость

Поскольку куча не используется, 0-1 BFS работает за O(V + E), заметно быстрее алгоритма Дейкстры на том же графе.

Когда его использовать

Используйте этот алгоритм, когда переходы бесплатны или стоят единицу, например на сетках, где одни шаги заблокированы, а другие доступны.

Быстрая проверка

Вы выполнили релаксацию соседа через ребро с весом 0. Куда его добавить?

Повторение: 0-1 BFS

С помощью дека добавляйте рёбра с весом 0 в начало, а рёбра с весом 1 — в конец. Так Вы получаете кратчайшие пути за чистое время O(V+E). ⚡

Часто задаваемые вопросы

Урок «0-1 BFS с деком» бесплатный?

Да — полный текст урока «0-1 BFS с деком» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Competitive Programming Academy, подпишись на CoddyKit PRO. Курс Competitive Programming Academy содержит 4 уроков всего.

Чему я научусь в уроке «0-1 BFS с деком»?

Находите кратчайшие пути при весах 0 или 1 Ты практикуешь Competitive Programming Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Competitive Programming Academy?

Предыдущий опыт не требуется. Competitive Programming Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «0-1 BFS с деком»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Competitive Programming Academy?

Да. Каждый урок Competitive Programming Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Алгоритм Дейкстры с кучей
  2. 0-1 BFS с деком
  3. Беллман — Форд и отрицательные рёбра
  4. Алгоритм Флойда — Уоршелла для всех пар
← Назад к Competitive Programming Academy