Алгоритм Флойда — Уоршелла для всех пар
Находите кратчайшие пути между каждой парой вершин
«Алгоритм Флойда — Уоршелла для всех пар» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Алгоритм Дейкстры с кучей
- 0-1 BFS с деком
- Беллман — Форд и отрицательные рёбра
- Алгоритм Флойда — Уоршелла для всех пар