diff --git a/базовые-алгоритмы-нахождения-кратчайших-путей-во-взвешенных-графах.md b/базовые-алгоритмы-нахождения-кратчайших-путей-во-взвешенных-графах.md index 9a3648f..958dda7 100644 --- a/базовые-алгоритмы-нахождения-кратчайших-путей-во-взвешенных-графах.md +++ b/базовые-алгоритмы-нахождения-кратчайших-путей-во-взвешенных-графах.md @@ -1,4 +1,5 @@ # Базовые алгоритмы нахождения кратчайших путей во взвешенных графах. +[Статья с хабра](https://habrahabr.ru/post/119158/) ## Алгоритм Флойда-Уоршелла Находит расстояние от каждой вершины до каждой за количество операций порядка **n^3**. Веса могут быть отрицательными, но у нас не может быть циклов с отрицательной суммой весов рёбер (иначе мы можем ходить по нему сколько душе угодно и каждый раз уменьшать сумму, так не интересно). В массиве d[0… n — 1][0… n — 1] на i-ой итерации будем хранить ответ на исходную задачу с ограничением на то, что в качестве «пересадочных» в пути мы будем использовать вершины с номером строго меньше i — 1 (вершины нумеруем с нуля). Пусть идёт i-ая итерация, и мы хотим обновить массив до i + 1-ой. Для этого для каждой пары вершин просто попытаемся взять в качестве пересадочной i — 1-ую вершину, и если это улучшает ответ, то так и оставим. Всего сделаем n + 1 итерацию, после её завершения в качестве «пересадочных» мы сможем использовать любую, и массив d будет являться ответом.