Алгоритм Форда-Беллмана — различия между версиями
(→Корректность алгоритма Форда-Беллмана) |
(Переделывание под изложение как на лекции) |
||
Строка 2: | Строка 2: | ||
:Для заданного взвешенного графа <tex>G = (V, E)</tex> алгоритм находит кратчайшие пути из заданной вершины <tex> s </tex> до всех остальных вершин.<br> | :Для заданного взвешенного графа <tex>G = (V, E)</tex> алгоритм находит кратчайшие пути из заданной вершины <tex> s </tex> до всех остальных вершин.<br> | ||
:В случае когда в графе <tex> G </tex> содержатся отрицательные циклы достижимые из <tex> s </tex> алгоритм сообщает, что кратчайших путей не существует. | :В случае когда в графе <tex> G </tex> содержатся отрицательные циклы достижимые из <tex> s </tex> алгоритм сообщает, что кратчайших путей не существует. | ||
+ | |||
+ | ==Введение== | ||
+ | :Сначала стоит вспомнить формулу для пути длины <tex>k</tex>. | ||
+ | ::<tex> d[k][u] = \sum\limits_{v : vu \; \in E} d[k-1][v] </tex> | ||
+ | :Теперь перепишем ее для пути кратчайшей длины. <tex>s</tex> {{---}} стартовая вершина. | ||
+ | ::<tex> d[k][u] = \min\limits_{v : vu \; \in E}(d[k-1][v] \: + \: \omega[uv])</tex>, при этом <tex>d[0][s] = 0</tex>, а <tex>d[0][u] = +\inf </tex> | ||
==Псевдокод== | ==Псевдокод== | ||
+ | :Используя приведенные формулы, алгоритм можно реализовать методом динамического программирования. | ||
+ | |||
+ | '''for''' <tex>(k = 0..n-2)</tex> | ||
+ | '''for''' <tex>(v \in V)</tex> | ||
+ | '''for''' <tex>(u : vu \; \in E)</tex> | ||
+ | <tex>d[k][u] \gets \min(d[k+1][u], \; d[k][v] + \omega(u,v))</tex> | ||
− | + | :Также релаксацию можно свести к одномерному случаю (одномерный массив будем обозначать <tex>d'</tex>): | |
− | + | :<tex>d'[u] \gets \min(d'[u], \; d'[v] + \omega(u,v))</tex> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==Корректность алгоритма Форда-Беллмана== | ==Корректность алгоритма Форда-Беллмана== |
Версия 17:45, 27 февраля 2012
Содержание
Алгоритм
- Для заданного взвешенного графа
- В случае когда в графе содержатся отрицательные циклы достижимые из алгоритм сообщает, что кратчайших путей не существует.
Введение
- Сначала стоит вспомнить формулу для пути длины
- Теперь перепишем ее для пути кратчайшей длины.
- , при этом , а
— стартовая вершина.
Псевдокод
- Используя приведенные формулы, алгоритм можно реализовать методом динамического программирования.
forfor for
- Также релаксацию можно свести к одномерному случаю (одномерный массив будем обозначать ):
Корректность алгоритма Форда-Беллмана
- В этом алгоритме используется релаксация, в результате которой
- - фактический вес кратчайшего пути из в вершину .
Лемма: |
Пусть — взвешенный ориентированный граф, — стартовая вершина.Тогда после завершения итераций цикла для всех вершин, достижимых из , выполняется равенство . |
Доказательство: |
|
Теорема: |
Пусть - взвешенный ориентированный граф, — стартовая вершина.Если граф не содержит отрицательных циклов, достижимых из вершины , то алгоритм возвращает и для всех . Если граф содержит отрицательные циклы, достижимые из вершины , то алгоритм возвращает |
Доказательство: |
|
Сложность
- Инициализация занимает
Итого алгоритм Беллмана-Форда работает за времени. времени, каждый из проходов требует времени, обход по всем ребрам для проверки наличия отрицательного цикла занимает времени.
Источники
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ / пер. с англ. — изд. 2-е — М.: Издательский дом «Вильямс», 2009. — с.672 — 676. — ISBN 978-5-8459-0857-5.
- Алгоритм Форда-Беллмана