Алгоритм Форда-Беллмана — различия между версиями
(→Корректность алгоритма Форда-Беллмана) |
(Переделывание под изложение как на лекции) |
||
| Строка 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
Содержание
Алгоритм
- Для заданного взвешенного графа алгоритм находит кратчайшие пути из заданной вершины до всех остальных вершин.
- В случае когда в графе содержатся отрицательные циклы достижимые из алгоритм сообщает, что кратчайших путей не существует.
Введение
- Сначала стоит вспомнить формулу для пути длины .
- Теперь перепишем ее для пути кратчайшей длины. — стартовая вершина.
- , при этом , а
Псевдокод
- Используя приведенные формулы, алгоритм можно реализовать методом динамического программирования.
for for for
- Также релаксацию можно свести к одномерному случаю (одномерный массив будем обозначать ):
Корректность алгоритма Форда-Беллмана
- В этом алгоритме используется релаксация, в результате которой уменьшается до тех пор, пока не станет равным .
- - оценка веса кратчайшего пути из вершины в каждую вершину .
- - фактический вес кратчайшего пути из в вершину .
| Лемма: |
Пусть — взвешенный ориентированный граф, — стартовая вершина. Тогда после завершения итераций цикла для всех вершин, достижимых из , выполняется равенство . |
| Доказательство: |
|
| Теорема: |
Пусть - взвешенный ориентированный граф, — стартовая вершина. Если граф не содержит отрицательных циклов, достижимых из вершины , то алгоритм возвращает и для всех . Если граф содержит отрицательные циклы, достижимые из вершины , то алгоритм возвращает |
| Доказательство: |
|
Сложность
- Инициализация занимает времени, каждый из проходов требует времени, обход по всем ребрам для проверки наличия отрицательного цикла занимает времени.
Итого алгоритм Беллмана-Форда работает за времени.
Источники
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ / пер. с англ. — изд. 2-е — М.: Издательский дом «Вильямс», 2009. — с.672 — 676. — ISBN 978-5-8459-0857-5.
- Алгоритм Форда-Беллмана