Алгоритм Форда-Беллмана
Алгоритм
Для заданного взвешенного графа алгоритм находит кратчайшие пути из заданной вершины до всех остальных вершин. В, случае, когда в графе содержатся отрицательные циклы, достижимые из , алгоритм сообщает, что кратчайших путей не существует.
Введение
Сначала стоит вспомнить формулу для количества путей длины . Теперь перепишем ее для пути кратчайшей длины. — стартовая вершина. , при этом , а
| Лемма: |
Если существует кратчайший путь от до , то |
| Доказательство: |
| Пусть кратчайший путь состоит из ребер, тогда корректность формулы следует из динамики, приведенной ниже. |
Псевдокод
Используя приведенные формулы, алгоритм можно реализовать методом динамического программирования.
for for for
Также релаксацию можно свести к одномерному случаю (одномерный массив будем обозначать ):
Корректность
| Лемма: |
Пусть — взвешенный ориентированный граф, — стартовая вершина.
Тогда после завершения итераций цикла выполняется неравенство . |
| Доказательство: |
|
Воспользуемся индукцией по : База индукции
Индукционный переход
|
Реализация алгоритма и ее корректность
Bellman_Ford(G, s) for для каждой for to for для каждого ребра if then for для каждого ребра if then return return
В этом алгоритме используется релаксация, в результате которой уменьшается до тех пор, пока не станет равным .
- оценка веса кратчайшего пути из вершины в каждую вершину .
- фактический вес кратчайшего пути из в вершину .
| Лемма: |
Пусть — взвешенный ориентированный граф, — стартовая вершина. Тогда после завершения итераций цикла для всех вершин, достижимых из , выполняется равенство . |
| Доказательство: |
|
Рассмотрим произвольную вершину , достижимую из . Пусть , где , — кратчайший ациклический путь из в . Путь содержит не более ребер. Поэтому . Докажем следующее утверждение:
Воспользуемся индукцией по : База индукции
Индукционный переход
|
| Теорема: |
Пусть - взвешенный ориентированный граф, — стартовая вершина. Если граф не содержит отрицательных циклов, достижимых из вершины , то алгоритм возвращает и для всех . Если граф содержит отрицательные циклы, достижимые из вершины , то алгоритм возвращает . |
| Доказательство: |
|
Пусть граф не содержит отрицательных циклов, достижимых из вершины . Тогда если вершина достижима из , то по лемме . Если вершина не достижима из , то из несуществования пути. Теперь докажем, что алгоритм вернет значение . После выполнения алгоритма верно, что для всех , значит ни одна из проверок не вернет значения . Пусть граф содержит отрицательный цикл , где , достижимый из вершины . Тогда . Предположим, что алгоритм возвращает , тогда для выполняется . Просуммируем эти неравенства по всему циклу: . Из того, что следует, что . Получили, что , что противоречит отрицательности цикла . |
Сложность
Инициализация занимает времени, каждый из проходов требует времени, обход по всем ребрам для проверки наличия отрицательного цикла занимает времени. Значит алгоритм Беллмана-Форда работает за времени.
Нахождение отрицательного цикла
Приведенная выше реализация позволяет определить наличие в графе цикла отрицательного веса. Чтобы найти сам цикл, достаточно запоминать вершины, из которых производится релаксация. Тогда, если после итерации найдется вершина , расстояние до которой можно уменьшить, то эта вершина либо лежит на каком-нибудь цикле отрицательного веса, либо достижима из него. Чтобы найти вершину, которая лежит на цикле, можно раз пройти назад по предкам из вершины . Так как наибольшая длина пути в графе из вершин равна , то полученная вершина будет гарантированно лежать на отрицательном цикле. Теперь, зная что вершина лежит на цикле отрицательного веса, можно пройти из нее по предкам, пока не придем в ту же вершину . Это обязательно произойдет, так как в цикле отрицательного веса релаксации происходят по кругу.
Neg_Cycle(G, s) for для каждой for to for для каждого ребра if then for для каждого ребра if then for to while break return
Источники
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ / пер. с англ. — изд. 2-е — М.: Издательский дом «Вильямс», 2009. — с.672 — 676. — ISBN 978-5-8459-0857-5.
- Алгоритм Форда-Беллмана