Алгоритм Дейкстры
НЕТ ВОЙНЕ |
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Задача: |
Для заданного взвешенного графа | найти кратчайшие пути из заданной вершины до всех остальных вершин. Веса всех рёбер неотрицательны.
Содержание
Алгоритм
В ориентированном взвешенном графе , вес рёбер которого неотрицателен и определяется весовой функцией , алгоритм Дейкстры находит длины кратчайших путей из заданной вершины до всех остальных.
В алгоритме поддерживается множество вершин , для которых уже вычислены длины кратчайших путей до них из . На каждой итерации основного цикла выбирается вершина , которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина добавляется в множество и производится релаксация всех исходящих из неё рёбер.
Псевдокод
func dijkstra(s): ford[v] = used[v] = false d[s] = 0 for v = null for // найдём вершину с минимальным расстоянием if !used[j] and (v == null or d[j] < d[v]) v = j if d[v] == break used[v] = true for e : исходящие из v рёбра // произведём релаксацию по всем рёбрам, исходящим из v if d[v] + e.len < d[e.to] d[e.to] = d[v] + e.len
Обоснование корректности
Теорема: |
Пусть — ориентированный взвешенный граф, вес рёбер которого неотрицателен, — стартовая вершина.
Тогда после выполнения алгоритма Дейкстры для всех , где — длина кратчайшего пути из вершины в вершину |
Доказательство: |
Докажем по индукции, что в момент посещения любой вершины , .
|
Оценка сложности
В реализации алгоритма присутствует функция выбора вершины с минимальным значением
и релаксация по всем рёбрам для данной вершины. Асимптотика работы зависит от реализации.Пусть
— количество вершин в графе, — количество рёбер в графе.Время работы | Описание | |||
---|---|---|---|---|
Поиск минимума | Релаксация | Общее | ||
Наивная реализация | раз осуществляем поиск вершины с минимальной величиной среди непомеченных вершин и раз проводим релаксацию за . Для плотных графов ( ) данная асимптотика является оптимальной. | |||
Двоичная куча | Используя двоичную кучу можно выполнять операции извлечения минимума и обновления элемента за | . Тогда время работы алгоритма Дейкстры составит .|||
Фибоначчиева куча | Используя Фибоначчиевы кучи можно выполнять операции извлечения минимума за | и обновления элемента за . Таким образом, время работы алгоритма составит .
На практике удобно использовать стандартные контейнеры (например, std::set или std::priority_queue в C++).
При реализации необходимо хранить вершины, которые упорядочены по величине , для этого в контейнер можно помещать пару — расстояние-вершина. В результате будут храниться пары, упорядоченные по расстоянию.
Изначально поместим в контейнер стартовую вершину
В обычных кучах нет операции удаления произвольного элемента. При релаксации можно не удалять старые пары, в результате чего в куче может находиться одновременно несколько пар расстояние-вершина для одной вершины (с разными расстояниями). Для корректной работы при извлечении из кучи будем проверять расстояние: пары, в которых расстояние отлично от будем игнорировать. При этом асимптотика будет вместо .
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4
- MAXimal :: algo :: Нахождение кратчайших путей от заданной вершины до всех остальных вершин алгоритмом Дейкстры
- Википедия — Алгоритм Дейкстры
- Wikipedia — Dijkstra's algorithm