Превращение пометки в постоянную

Обновление пометок

Присвоение начальных значений

Алгоритм Дейкстра поиска кратчайших путей в графе

Наиболее эффективный алгоритм решения задачи о кратчайшем пути первоначально дал Дейкстра. В общем случае этот метод основан на приписывании вершинам временных пометок, причем пометка вершины дает верхнюю границу длины пути от некоторой вершины s к рассматриваемой вершине. Эти пометки постепенно уменьшаются с помощью некоторой итерационной процедуры, и на каждом шаге итерации только одна из временных пометок становится постоянной. Последнее указывает на то, что пометка уже не является верхней границей, а дает точную длину кратчайшего пути от t к рассматриваемой вершине. Рассмотрим подробнее этот алгоритм.

Дан граф G = (X, A, C) со взвешенными дугами, пример которого показан на рис. 9.1 Обозначим L(хi) пометку вершины хi. Веса дуг (или ребер) даны матрицей весов (таблица 9.1).

Рис. 9.1. Граф со взвешенными дугами

Таблица 9.1. Матрица весов расстояний
  с1 с3  
    с2  
      с5
  с4    

Рассмотрим алгоритм нахождения кратчайшего пути от вершины s к вершине t графа и более общий случай: от вершины s ко всем вершинам графа.

Ш А Г 1. Положить L(s) = 0 и считать эту пометку постоянной. Для всех вершин хi s положить L(хi)= ∞ и считать эти пометки временными. За текущую рассматриваемую вершину с постоянной пометкой возьмем вершину p, т. е. положить p = s.

Ш А Г 2. Для вершин, входящих в прямое отображение вершины р, т. е. для всех хi, принадлежащих Г(p), пометки которых временные, изменить пометки в соответствии со следующим выражением:

L(хi) min [ L(хi), L(p) + C(p, хi) ].

Ш А Г 3. Среди всех вершин с временными пометками найти такую, для которой

L(x*i)=min[L(xi)].

Ш А Г 4. Считать пометку вершины x*i постоянной и положить p=x*i.

Ш А Г 5(a). { При нахождении пути от s к t}

  • Если текущая вершина p является искомой, т. е. p = t, то L(p) является длиной кратчайшего пути от s к t. Останов.
  • Если p t, перейти к шагу 2.

Ш А Г 5(б). { При нахождении путей от s ко всем вершинам }

  • Если все вершины отмечены постоянными метками, то эти метки дают длины кратчайших путей.
  • Если некоторые метки являются временными, то следует перейти к шагу 2.

Как только длины кратчайших путей от вершины s будут найдены, сами пути можно получить с помощью рекурсивной процедуры (*). Так как вершина x*i непосредственно предшествует вершине хi в кратчайшем пути от s к хi, то для любой вершины хi соответствующую вершину x*i можно найти как одну из оставшихся вершин, для которой

L(x*i)+c(x*i, xi)=L(xi).(*)

Если кратчайший путь от s до любой вершины хi является единственным, то дуги (x*i, xi) этого кратчайшего пути образуют ориентированное дерево с корнем s. Если существует несколько кратчайших путей от s к какой-либо другой вершине, то при некоторой фиксированной вершине x*i соотношение (*) будет выполняться для более чем одной вершины хi. В этом случае выбор может быть либо произвольным (если нужен какой-то один кратчайший путь между s и хi), либо таким, что рассматриваются все дуги (x*2,x2), входящие в какой-либо из кратчайших путей, и при этом совокупность всех таких дуг образует не ориентированное дерево, а общий граф, называемый базой относительно s.

П р и м е р. Рассмотрим граф смешанного типа, изображенный на рис. 9.2,а, где каждое неориентированное ребро рассматривается как пара противоположно направленных дуг равного веса. Матрица весов приведена на рис. 9.2,б. Требуется найти все кратчайшие пути от вершины х1 ко всем остальным вершинам.

Рис. 9.2. Пример поиска кратчайшего пути: а – граф; б – матрица весов дуг

Постоянные пометки будем помечать знаком +.

Ш А Г 1. Присвоим L(х1) = 0, L(хi) = ∞ для всех хi, кроме х1. Положим р = х1.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: