Алгоритм Дейкстры — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «{{В разработке}} == Алгоритм == В ориентированном взвешанном графе <tex>G = (V, E)</tex>, вес рёбер кот…»)
 
Строка 1: Строка 1:
 
{{В разработке}}
 
{{В разработке}}
 +
 +
В ориентированном взвешанном графе <tex>G = (V, E)</tex>, вес рёбер которого неотрицателен и определяется весовой функцией <tex>w(uv) \geqslant 0</tex>, Алгоритм Дейкстры находит длину кратчайшего пути из одной вершины <tex>s</tex> до всех остальных.
  
 
== Алгоритм ==
 
== Алгоритм ==
В ориентированном взвешанном графе <tex>G = (V, E)</tex>, вес рёбер которого неотрицателен, Алгоритм Дейкстры находит длинну кратчайшего пути из одной вершины <tex>s</tex> до всех остальных.
+
В алгоритме поддерживается множество вершин <tex>S</tex>, для которых уже вычислены кратчайшие пути к ним из вершины <tex>s</tex>. На каждой итерации основного цикла выбирается вершина <tex> u \in V \setminus S</tex>, которой на текущий момент соответствует минимальная оценка  кратчайшего пути. Вершина <tex>u</tex> добавляется в множество <tex>S</tex> и производится релаксация всех исходящих из неё рёбер.
 +
 
 
== Псевдокод ==
 
== Псевдокод ==
 
  '''Dijkstra'''(<tex>G</tex>, <tex>w</tex>, <tex>s</tex>)
 
  '''Dijkstra'''(<tex>G</tex>, <tex>w</tex>, <tex>s</tex>)
    <tex>d \gets \infty</tex>
+
  <tex>d \gets \infty</tex>
    <tex>d[s] \gets 0</tex>
+
  <tex>d[s] \gets 0</tex>
    <tex>S \gets \emptyset</tex>
+
  <tex>S \gets \emptyset</tex>
    <tex>Q \gets V[G]</tex>
+
  '''while''' <tex>V \setminus S \neq \emptyset</tex>
    '''while''' <tex>Q \neq \emptyset</tex>
+
      '''do''' ''argmin''(<tex>v : v \in V \setminus S, d[v]</tex>)
        '''do''' <tex>u \gets</tex> ''Extract_Min''(<tex>Q</tex>)
+
          <tex>S \gets S \cup \{u\}</tex>
            <tex>s \gets S \cup \{u\}</tex>
+
          '''for''' <tex>(uv) \in E</tex>
            '''for''' <tex>(uv) \in E</tex>
+
              '''do''' ''relax''(<tex>u</tex>, <tex>v</tex>, <tex>w</tex>)
                '''do''' ''Relax''(<tex>u</tex>, <tex>v</tex>, <tex>w</tex>)
+
 
 
== Обоснование корректности работы ==
 
== Обоснование корректности работы ==
 +
{{Теорема
 +
|statement=После окончания работы алгоритма Дейкстры для всех вершин <tex>u \in V(G)</tex> будет выполняться равенство <tex>d[u] = \delta(s, u)</tex>
 +
|proof=
 +
Рассмотрим инвариант основного цикла: в начале каждой итерации для всех вершин <tex>v \in S</tex> выполняется <tex>d[v] = \delta(s, u)</tex>
 +
 +
'''Инициализация'''. Изначально множество <tex>S</tex> пусто, инвариант выполняется.
 +
 +
'''Сохранение'''.
 +
}}
 +
 
== Оценка сложности ==
 
== Оценка сложности ==
== литература ==
+
== Литература ==
 
* ''Кормен Т. Х., Лейзерсон Ч. И., Ривест Р. Л., Штайн К.'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
 
* ''Кормен Т. Х., Лейзерсон Ч. И., Ривест Р. Л., Штайн К.'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
  
 
[[Категория: Алгоритмы и структуры данных]]
 
[[Категория: Алгоритмы и структуры данных]]
 
[[Категория: Кратчайшие пути в графах ]]
 
[[Категория: Кратчайшие пути в графах ]]

Версия 07:29, 6 декабря 2010

Эта статья находится в разработке!

В ориентированном взвешанном графе [math]G = (V, E)[/math], вес рёбер которого неотрицателен и определяется весовой функцией [math]w(uv) \geqslant 0[/math], Алгоритм Дейкстры находит длину кратчайшего пути из одной вершины [math]s[/math] до всех остальных.

Алгоритм

В алгоритме поддерживается множество вершин [math]S[/math], для которых уже вычислены кратчайшие пути к ним из вершины [math]s[/math]. На каждой итерации основного цикла выбирается вершина [math] u \in V \setminus S[/math], которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина [math]u[/math] добавляется в множество [math]S[/math] и производится релаксация всех исходящих из неё рёбер.

Псевдокод

Dijkstra([math]G[/math], [math]w[/math], [math]s[/math])
  [math]d \gets \infty[/math]
  [math]d[s] \gets 0[/math]
  [math]S \gets \emptyset[/math]
  while [math]V \setminus S \neq \emptyset[/math]
      do argmin([math]v : v \in V \setminus S, d[v][/math])
         [math]S \gets S \cup \{u\}[/math]
         for [math](uv) \in E[/math]
             do relax([math]u[/math], [math]v[/math], [math]w[/math])

Обоснование корректности работы

Теорема:
После окончания работы алгоритма Дейкстры для всех вершин [math]u \in V(G)[/math] будет выполняться равенство [math]d[u] = \delta(s, u)[/math]
Доказательство:
[math]\triangleright[/math]

Рассмотрим инвариант основного цикла: в начале каждой итерации для всех вершин [math]v \in S[/math] выполняется [math]d[v] = \delta(s, u)[/math]

Инициализация. Изначально множество [math]S[/math] пусто, инвариант выполняется.

Сохранение.
[math]\triangleleft[/math]

Оценка сложности

Литература

  • Кормен Т. Х., Лейзерсон Ч. И., Ривест Р. Л., Штайн К. Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)