For faster navigation, this Iframe is preloading the Wikiwand page for Алгоритм Беллмана — Форда.

Алгоритм Беллмана — Форда

Материал из Википедии — свободной энциклопедии

Алгоритм Беллмана — Форда
Назван в честь Ричард Беллман и Лестер Форд
Автор Ричард Беллман, Лестер Форд и Эдвард Форест Мур
Предназначение поиск кратчайшего пути в графе
Структура данных граф
Худшее время
Лучшее время
Затраты памяти
Логотип Викисклада Медиафайлы на Викискладе

Алгоритм Беллмана — Форда — алгоритм поиска кратчайшего пути во взвешенном графе. За время алгоритм находит кратчайшие пути от одной вершины графа до всех остальных. В отличие от алгоритма Дейкстры, алгоритм Беллмана — Форда допускает рёбра с отрицательным весом. Предложен независимо Ричардом Беллманом и Лестером Фордом.

Алгоритм маршрутизации RIP (алгоритм Беллмана — Форда) был впервые разработан в 1969 году, как основной для сети ARPANET.

Формулировка задачи

[править | править код]

Дан ориентированный или неориентированный граф со взвешенными рёбрами. Длиной пути назовём сумму весов рёбер, входящих в этот путь. Требуется найти кратчайшие пути от выделенной вершины до всех вершин графа.

Заметим, что кратчайших путей может не существовать. Так, в графе, содержащем цикл с отрицательным суммарным весом, существует сколь угодно короткий путь от одной вершины этого цикла до другой (каждый обход цикла уменьшает длину пути). Цикл, сумма весов рёбер которого отрицательна, называется отрицательным циклом.

Решение задачи на графе без отрицательных циклов

[править | править код]

Решим поставленную задачу на графе, в котором заведомо нет отрицательных циклов.

Для нахождения кратчайших путей от одной вершины до всех остальных, воспользуемся методом динамического программирования. Построим матрицу , элементы которой будут обозначать следующее:  — это длина кратчайшего пути из в , содержащего не более рёбер.

Путь, содержащий 0 рёбер, существует только до вершины . Таким образом, равно 0 при , и в противном случае.

Теперь рассмотрим все пути из в , содержащие ровно рёбер. Каждый такой путь есть путь из ребра, к которому добавлено последнее ребро. Если про пути длины все данные уже подсчитаны, то определить -й столбец матрицы не составляет труда.

Так выглядит алгоритм поиска длин кратчайших путей в графе без отрицательных циклов:

for 
  do 

for  to 
  do for 
    if 
      then 
return 

Здесь  — множество вершин графа ,  — множество его рёбер, а  — весовая функция, заданная на рёбрах графа (возвращает длину дуги, ведущей из вершины в ),  — массив, содержащий расстояния от вершины до любой другой вершины.

Внешний цикл выполняется раз, поскольку кратчайший путь не может содержать большее число рёбер, иначе он будет содержать цикл, который точно можно выкинуть.

Вместо массива можно хранить всю матрицу , но это требует памяти. Зато при этом можно вычислить и сами кратчайшие пути, а не только их длины. Для этого заведем матрицу .

Если элемент содержит длину кратчайшего пути из в , содержащего рёбер, то содержит предыдущую вершину до в одном из таких кратчайших путей (ведь их может быть несколько).

Теперь алгоритм Беллмана-Форда выглядит так:

for 
  for  to 
    do 

for  to 
  do for 
    if 
      then 
           

После выполнения этого алгоритма элементы содержат длины кратчайших путей от до с количеством рёбер , и из всех таких путей следует выбрать самый короткий. А сам кратчайший путь до вершины с рёбрами восстанавливается так:

while 
  
  
  
return p

Граф с отрицательными циклами

[править | править код]

Алгоритм Беллмана-Форда позволяет очень просто определить, существует ли в графе отрицательный цикл, достижимый из вершины . Достаточно произвести внешнюю итерацию цикла не , a ровно раз. Если при исполнении последней итерации длина кратчайшего пути до какой-либо вершины строго уменьшилась, то в графе есть отрицательный цикл, достижимый из . На основе этого можно предложить следующую оптимизацию: отслеживать изменения в графе и, как только они закончатся, сделать выход из цикла (дальнейшие итерации будут бессмысленны).

Литература

[править | править код]
  • R. Bellman: On a Routing Problem // Quarterly of Applied Mathematics. 1958. Vol 16, No. 1. C. 87-90, 1958.
  • L. R. Ford, Jr., D. R. Fulkerson. Flows in Networks, Princeton University Press, 1962.
Для улучшения этой статьи по математике желательно: Исправить статью согласно стилистическим правилам Википедии.Оформить статью по правилам.После исправления проблемы исключите её из списка. Удалите шаблон, если устранены все недостатки.
{{bottomLinkPreText}} {{bottomLinkText}}
Алгоритм Беллмана — Форда
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.

X

Get ready for Wikiwand 2.0 🎉! the new version arrives on September 1st! Don't want to wait?