Алгоритм Беллмана — Форда
Клас | Задача про найкоротший шлях (для зважених орієнтованих графів) |
---|---|
Структура даних | граф |
Найгірша швидкодія | |
Просторова складність у найгіршому випадку |
Алгоритм Беллмана—Форда — алгоритм пошуку найкоротшого шляху в зваженому графі. Знаходить найкоротші шляхи від однієї вершини графу до всіх інших. На відміну від алгоритму Дейкстри, алгоритм Беллмана—Форда допускає ребра з негативною вагою. Запропоновано незалежно Річардом Беллманом і Лестером Фордом.
Алгоритм носить ім'я двох американських вчених: Річарда Беллмана (Richard Bellman) і Лестера Форда (Lester Ford). Форд фактично винайшов цей алгоритм в 1956 році при вивченні іншої математичної задачі, підзадача якої звелася до пошуку найкоротшого шляху в графі, і Форд зробив начерк остаточного вирішення завдання цього алгоритму. Беллман в 1958 р. опублікував статтю, присвячену конкретно завданню знаходження найкоротшого шляху, і в цій статті він чітко сформулював алгоритм у тому вигляді, в якому він відомий нам зараз.
Алгоритм маршрутизації RIP (алгоритм Беллмана — Форда) був вперше розроблений в 1969 році, як основний для мережі ARPANET.
Дано орієнтований або неорієнтований граф з ваговою функцією Вагою шляху назвемо суму ваг ребер, що входять в цей шлях:
Вхідними даними для алгоритму є граф вагова функція та стартова вершина Потрібно знайти найкоротші шляхи від вершини до всіх вершин графу. Алгоритм Беллмана-Форда повертає логічне значення, яке вказує на те, чи міститься в графі цикл з негативною вагою, досяжний з витоку. Якщо такий цикл існує у графі алгоритм повідомляє, що найкоротших шляхів не існує. Якщо ж таких циклів немає, алгоритм видає найкоротші шляхи і їх вагу.
Сам алгоритм Форда-Беллмана представляє з себе кілька фаз. На кожній фазі проглядаються всі ребра графу, і алгоритм намагається справити релаксацію (relax, ослаблення) уздовж кожного ребра ваги . Релаксація вздовж ребра — це спроба поліпшити значення значенням . Фактично це означає, що ми намагаємося поліпшити значення для вершини користуючись ребром і поточним значенням для вершини . Стверджується, що достатньо фази алгоритму, щоб коректно порахувати довжини всіх найкоротших шляхів у графі (цикли негативної ваги відсутні). Для недосяжних вершин відстань залишиться нескінченністю.
// Ініціалізація для кожної вершини // Основна частина для до для кожного ребра якщо // зберігаємо попередню вершину // Перевірка на наявність циклів з від'ємною вагою для кожного ребра якщо повернути ХИБА повернути ІСТИНА
Якщо граф заданий списком ребер: ініціалізація потребує часу, кожен з проходів потребує часу, прохід по усім ребрам для перевірки наявності негативного циклу займає часу. Отже алгоритм працює за часу.
Якщо граф заданий матрицею суміжності, то алгоритм буде виконуватись за часу.
- 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.
- Реалізація алгоритму Белмана — Форда на e-maxx.ru [Архівовано 7 вересня 2011 у Wayback Machine.]
- Реалізація алгоритму пошуку негативного циклу на e-maxx.ru [Архівовано 7 вересня 2011 у Wayback Machine.]