АЛГ-FW-007O(V³)Все парыревизия 2026-05-04

Алгоритм Флойда-Уоршелла

Поиск кратчайших путей между всеми парами вершин. Сложность O(V³). Работает с отрицательными весами.

⏱ ~30 сек · алгоритм · O(N)
Отчёт · АЛГ-FW-007|алгоритм / численный метод
calcal.ru / algoritm-floyda-uorshella-onlajn
Загрузка калькулятора…
O(V³)
Сложность
Память
1962
Флойд+Уоршелл
+/−
Любые веса

Принцип Флойда-Уоршелла

Алгоритм Флойда-Уоршелла — классический алгоритм нахождения кратчайших путей между ВСЕМИ парами вершин в графе. Использует динамическое программирование.

Разработан независимо Робертом Флойдом и Стивеном Уоршеллом в 1962 г. (Уоршелл — для транзитивного замыкания, Флойд — для кратчайших путей).

Идея: dist[i][k] — длина кратчайшего пути от i до j, использующего только вершины {1..k} как промежуточные. На каждой итерации k увеличивается допустимое множество промежуточных вершин.

Псевдокод

function FloydWarshall(graph): n = number of vertices dist = copy of adjacency matrix next = matrix initialized as: next[i][j] = j for k = 1 to n: for i = 1 to n: for j = 1 to n: if dist[i][k] + dist[k][j] < dist[i][j]: dist[i][j] = dist[i][k] + dist[k][j] next[i][j] = next[i][k] return dist, next

Когда применять Флойд-Уоршелл

  • Все пары вершин нужны одновременно: вместо V × Дейкстра — один Флойд.
  • Плотный граф: E ≈ V². Сложность Флойда O(V³) = O(V·E), а Дейкстры × V = O(V·E·log V) — Флойд быстрее на log V.
  • Отрицательные веса: Дейкстра не работает, Флойд — да.
  • Поиск отрицательного цикла: после алгоритма проверьте dist[i][i] < 0.
  • Транзитивное замыкание: алгоритм Уоршелла — частный случай для булевых матриц.

Восстановление путей

Матрица dist даёт только длины путей. Чтобы получить сам путь, нужна вторая матрица next:

  • next[i][j] = следующая вершина после i на пути i → j.
  • Изначально: next[i][j] = j для всех рёбер (i,j).
  • При обновлении: если dist[i][k] + dist[k][j] < dist[i][j], то next[i][j] = next[i][k].
  • Восстановление пути от u до v: u → next[u][v] → next[next[u][v]][v] → ... → v.
ИСТОЧНИКИ
  1. Cormen, Leiserson, Rivest, Stein — CLRS, 4th ed., Ch. 23. CLRS. 2022.
  2. Floyd R.W. — Algorithm 97: Shortest Path. R.W. Floyd. 1962.
  3. Warshall S. — A theorem on Boolean matrices. S. Warshall. 1962.
ЧАСТЫЕ ВОПРОСЫ

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

Находит кратчайшие пути между ВСЕМИ парами вершин в графе за один проход. Это отличает его от Дейкстры (только от одной вершины ко всем). Разработан в 1962 г. Робертом Флойдом и Стивеном Уоршеллом независимо. Работает с положительными И ОТРИЦАТЕЛЬНЫМИ весами (но без отрицательных циклов).
O(V³), где V — число вершин. Для V=100 это 10⁶ операций (мгновенно). Для V=1000 — 10⁹ (1-10 сек). Для V=10000 — 10¹² (часы). Для очень больших графов лучше N×Дейкстра (O(V·E·log V)) или Джонсона. Для разрежённых графов с V=10000 и E=50000 алгоритм Джонсона быстрее в 1000 раз.
1) Когда нужны все кратчайшие пути одновременно. 2) Когда граф плотный (E ≈ V²) — тогда Флойд = Дейкстра по скорости. 3) Когда есть отрицательные веса (Дейкстра не работает). 4) Когда нужно проверить наличие отрицательного цикла. 5) В качестве вспомогательной матрицы в других алгоритмах.
Простой и красивый, всего 3 вложенных цикла: for k=1..V: for i=1..V: for j=1..V: if dist[i][k] + dist[k][j] < dist[i][j]: dist[i][j] = dist[i][k] + dist[k][j]. Идея: на k-й итерации matrix dist содержит кратчайшие пути, использующие только вершины {1..k} как промежуточные.
После работы алгоритма проверьте диагональ матрицы dist[i][i]. Если хоть одна dist[i][i] < 0, в графе есть отрицательный цикл, проходящий через i. Это позволяет одновременно с поиском путей детектировать отрицательные циклы (которые делают задачу некорректной).
Помимо матрицы расстояний dist можно вести матрицу next[i][j] — следующая вершина на пути от i до j. Изначально next[i][j] = j для всех рёбер. При обновлении dist: next[i][j] = next[i][k]. Восстановление: путь от u до v = [u, next[u][v], next[next[u][v]][v], ..., v]. Сложность восстановления O(V) на каждый путь.
Лиана Арифметова
АВТОРverifiedред. calcal.ru

Лиана Арифметова

Создатель и главный редактор

Миссия: демократизировать сложные расчёты. Превратить страх перед числами в ясность и контроль. Девиз: «Любая повторяющаяся задача заслуживает своего калькулятора».

Mathematical Engineering · МФТИ · редактирует каталог с 2012 года

Был ли этот калькулятор полезен?

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

Инструмент справочный — не заменяет эксперта

Только для информационных целей. Все расчёты, результаты и данные, предоставляемые инструментом, носят исключительно ознакомительный и справочный характер. Они не являются профессиональной консультацией — медицинской, юридической, финансовой, инженерной или иной.

Точность результатов. Калькулятор основан на общепринятых формулах и методиках, однако фактические результаты могут отличаться в зависимости от индивидуальных условий, исходных данных и применяемых стандартов. Мы не гарантируем полноту, точность или актуальность приведённых расчётов.

Профессиональные решения — медицинские, финансовые, инженерные — должны приниматься только после консультации с квалифицированным специалистом. Не используйте автоматический расчёт как единственное основание для важных решений.

Ограничение ответственности. Авторы и разработчики сервиса не несут ответственности за прямой или косвенный ущерб, возникший из-за использования данных расчётов. Пользователь принимает на себя всю ответственность за интерпретацию результатов.