0Pricing
Competitive Programming Academy · Урок

Алгоритм Флойда — Уоршелла для всех пар

Находите кратчайшие пути между каждой парой вершин

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

Все пары одновременно

Иногда нужно найти кратчайший путь между каждой парой вершин, а не только от одной исходной вершины. Это задача поиска кратчайших путей между всеми парами.

Знакомьтесь: Флойд — Уоршелл

Алгоритм Флойда — Уоршелла заполняет полную таблицу расстояний для всех пар с помощью трёх аккуратных вложенных циклов и почти без предварительной настройки.

Матрица расстояний

Используйте матрицу, в которой dist[i][j] — наилучшая известная стоимость пути из i в j. Изначально заполните её заданными прямыми рёбрами.

dist = [[INF] * n for _ in range(n)]

Установите диагональ

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

for i in range(n):
    dist[i][i] = 0

Идея промежуточной вершины

Приём заключается в следующем: разрешите путям проходить через промежуточную вершину k, а затем проверьте, не будет ли маршрут через k дешевле прямого пути.

Порядок циклов важен

Внешним должен быть цикл по k — выбранной промежуточной вершине. Внутренние циклы по i и j проверяют каждую пару относительно этой вершины.

for k in range(n):
  for i in range(n):
    for j in range(n):

Шаг релаксации

Для каждой пары выполните релаксацию через k: если путь из i в k, а затем из k в j короче, обновите dist[i][j] этой суммарной стоимостью.

if dist[i][k] + dist[k][j] < dist[i][j]:
    dist[i][j] = dist[i][k] + dist[k][j]

Почему k должен быть внешним

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

Отрицательные рёбра допустимы

Алгоритм Флойда — Уоршелла допускает отрицательные рёбра, но не отрицательные циклы. Отрицательный цикл оставляет некоторый диагональный элемент меньше нуля.

Время работы

Три цикла по n вершинам дают время O(n^3) и расход памяти O(n^2), поэтому алгоритм практически применим только при n в несколько сотен.

Когда его выбирать

Выбирайте алгоритм Флойда — Уоршелла, когда граф небольшой и плотный и Вам действительно нужны расстояния между всеми парами, а не только расстояния от одной исходной вершины.

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

Какой цикл должен быть внешним в алгоритме Флойда — Уоршелла?

Повторение: алгоритм Флойда — Уоршелла

Инициализируйте матрицу, установите нули на диагонали, затем запустите циклы k, i, j и выполните релаксацию через k. Кратчайшие пути между всеми парами за O(n^3). 🧮

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

Урок «Алгоритм Флойда — Уоршелла для всех пар» бесплатный?

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

Чему я научусь в уроке «Алгоритм Флойда — Уоршелла для всех пар»?

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

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

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

Сколько времени занимает урок «Алгоритм Флойда — Уоршелла для всех пар»?

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

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

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

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

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