Алгоритм Форда-Беллмана — различия между версиями
(→Корректность алгоритма Форда-Беллмана) |
|||
Строка 33: | Строка 33: | ||
− | : | + | : Докажем следующее утверждение: |
− | : | + | :: После <tex>n : (n \le k)</tex> итераций первого цикла алгоритма, <tex>d[v_n] = \delta(s, v_n) </tex> |
− | : Во время | + | : Воспользуемся индукцией по <tex>n</tex>: |
− | : | + | : '''База индукции.''' Перед первой итерацией утверждение очевидно выполнено: <tex>d[v_0] = d[s] = \delta(s, s) = 0</tex> |
+ | : '''Индукционный переход.''' Пусть после <tex>n : (n < k)</tex> итераций, верно что <tex>d[v_n] = \delta(s, v_n)</tex>. Так как <tex>(v_n, v_{n + 1})</tex> принадлежит кратчайшему пути от <tex>s</tex> до <tex>v</tex>, то <tex>\delta(s, v_{n+1}) = \delta(s, v_n) + \omega(v_n, v_{n + 1})</tex>. Во время <tex>l + 1</tex> итерации релаксируется ребро <tex>(v_n,v_{n+1})</tex>, следовательно по завершению итерации будет выполнено | ||
+ | ::<tex>d[v_{n+1}] \le d[v_n] + \omega(v_n, v_{n+1}) = \delta(s, v_n) + \omega(v_n, v_{n+1}) = \delta(s, v_{n+1})</tex>. | ||
+ | : Ясно, что <tex>d[v_{n+1}] \ge \delta(s, v_{n+1}) </tex>, поэтому верно что после <tex>l + 1</tex> итерации <tex>d[v_{n+1}] = \delta(s, v_{n + 1})</tex>. | ||
+ | : Индукционный переход доказан. | ||
− | : | + | : Итак, выполнены равенства <tex>d[v] = d[v_{k}] = \delta (s, v_{k}) = \delta (s, v))</tex>.<br> |
}} | }} | ||
Строка 58: | Строка 62: | ||
:Предположим, что алгоритм возвращает <tex> true </tex>, тогда для <tex> i = 1,...,k </tex> выполняется <tex> d[v_{i}] \leqslant d[v_{i-1}] + \omega (v_{i-1}, v_{i}) </tex>.<br> | :Предположим, что алгоритм возвращает <tex> true </tex>, тогда для <tex> i = 1,...,k </tex> выполняется <tex> d[v_{i}] \leqslant d[v_{i-1}] + \omega (v_{i-1}, v_{i}) </tex>.<br> | ||
:Просуммируем эти неравенства по всему циклу: <tex>\sum\limits_{i=1}^{k} {d[v_{i}]} \leqslant \sum\limits_{i=1}^{k} {d[v_{i-1}]} + \sum\limits_{i=1}^{k} {\omega (v_{i-1}, v_{i})} </tex>.<br> | :Просуммируем эти неравенства по всему циклу: <tex>\sum\limits_{i=1}^{k} {d[v_{i}]} \leqslant \sum\limits_{i=1}^{k} {d[v_{i-1}]} + \sum\limits_{i=1}^{k} {\omega (v_{i-1}, v_{i})} </tex>.<br> | ||
− | :Из того, что <tex> v_0 = v_{k} </tex> следует, что <tex> \sum\limits^{k}_{i=1} {d[v_{i}]} = \sum \limits_{i=1}^{k} {d[v_{i - 1}]} </tex>. | + | :Из того, что <tex> v_0 = v_{k} </tex> следует, что <tex> \sum\limits^{k}_{i=1} {d[v_{i}]} = \sum \limits_{i=1}^{k} {d[v_{i - 1}]} </tex>. |
Версия 07:35, 1 ноября 2011
Алгоритм
- Для заданного взвешенного графа
- В случае когда в графе содержатся отрицательные циклы достижимые из алгоритм сообщает, что кратчайших путей не существует.
Псевдокод
Bellman_Ford(G, s) for для каждойfor to for для каждого ребра if then for для каждого ребра if then return return
Корректность алгоритма Форда-Беллмана
- В этом алгоритме используется релаксация, в результате которой
- - фактический вес кратчайшего пути из в вершину .
Лемма: |
Пусть — взвешенный ориентированный граф, — стартовая вершина.Тогда после завершения итераций цикла для всех вершин, достижимых из , выполняется равенство . |
Доказательство: |
|
Теорема: |
Пусть - взвешенный ориентированный граф, — стартовая вершина.Если граф не содержит отрицательных циклов, достижимых из вершины , то алгоритм возвращает и для всех . Если граф содержит отрицательные циклы, достижимые из вершины , то алгоритм возвращает |
Доказательство: |
|
Сложность
- Инициализация занимает
Итого алгоритм Беллмана-Форда работает за времени. времени, каждый из проходов требует времени, обход по всем ребрам для проверки наличия отрицательного цикла занимает времени.
Источники
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ / пер. с англ. — изд. 2-е — М.: Издательский дом «Вильямс», 2009. — с.672 — 676. — ISBN 978-5-8459-0857-5.
- Алгоритм Форда-Беллмана