Алгоритм Дейкстры — различия между версиями
Строка 9: | Строка 9: | ||
== Псевдокод == | == Псевдокод == | ||
'''func''' dijkstra(s)''':''' | '''func''' dijkstra(s)''':''' | ||
− | '''for''' | + | '''for''' <tex>v \in V</tex> |
d[v] = <tex>\infty</tex> | d[v] = <tex>\infty</tex> | ||
used[v] = ''false'' | used[v] = ''false'' | ||
d[s] = 0 | d[s] = 0 | ||
− | '''for''' i | + | '''for''' <tex>i \in V</tex> |
v = ''null'' | v = ''null'' | ||
− | '''for''' j | + | '''for''' <tex>j \in V</tex> <font color="green">// найдем вершину с минимальным расстоянием</font> |
'''if''' !used[j] '''and''' (v == ''null'' '''or''' d[j] < d[v]) | '''if''' !used[j] '''and''' (v == ''null'' '''or''' d[j] < d[v]) | ||
v = j | v = j | ||
Строка 57: | Строка 57: | ||
|} | |} | ||
− | == Источники == | + | == Источники информации == |
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4 | * Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4 | ||
* [http://e-maxx.ru/algo/dijkstra MAXimal :: algo :: Нахождение кратчайших путей от заданной вершины до всех остальных вершин алгоритмом Дейкстры] | * [http://e-maxx.ru/algo/dijkstra MAXimal :: algo :: Нахождение кратчайших путей от заданной вершины до всех остальных вершин алгоритмом Дейкстры] |
Версия 02:50, 27 декабря 2015
Задача: |
Для заданного взвешенного графа | найти кратчайшие пути из заданной вершины до всех остальных вершин. Веса всех рёбер неотрицательны.
Содержание
Алгоритм
В ориентированном взвешенном графе , вес рёбер которого неотрицателен и определяется весовой функцией , алгоритм Дейкстры находит длины кратчайших путей из заданной вершины до всех остальных.
В алгоритме поддерживается множество вершин , для которых уже вычислены длины кратчайших путей до них из . На каждой итерации основного цикла выбирается вершина , которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина добавляется в множество и производится релаксация всех исходящих из неё рёбер.
Псевдокод
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
Обоснование корректности
Теорема: |
Пусть — ориентированный взвешенный граф, вес рёбер которого неотрицателен, — стартовая вершина.
Тогда после выполнения алгоритма Дейкстры для всех , где — длина кратчайшего пути из вершины в вершину |
Доказательство: |
Докажем по индукции, что в момент посещения любой вершины , .
|
Оценка сложности
Основной цикл выполняется
раз. Релаксация выполнится всего раз. В реализации алгоритма присутствует функция выбора вершины с минимальным значением , асимптотика её работы зависит от реализации.Таким образом:
Структура данных | Время работы |
---|---|
Наивная реализация | |
Двоичная куча | |
Фибоначчиева куча |
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4
- MAXimal :: algo :: Нахождение кратчайших путей от заданной вершины до всех остальных вершин алгоритмом Дейкстры
- Википедия — Алгоритм Дейкстры
- Wikipedia — Dijkstra's algorithm