Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методички 080502 / Математика / Основы дискретной математики.doc
Скачиваний:
165
Добавлен:
15.02.2016
Размер:
1.23 Mб
Скачать

§7. Задача о кратчайшем пути на графе. Алгоритм Дейкстры

Напомним, что сетью называется пара N=(G,α), где G – орграф, а α – функция из множества вершин графа в множество действительных чисел. Другими словами, каждой дуге графа поставлено в соответствие некоторое неотрицательное число, которое в данном случае называется длиной дуги. Введем длину пути как сумму длин дуг, составляющих путь. Расстоянием d(u,v) от вершины u до вершины v называется длина кратчайшего пути из u в v. Если нет ни одного пути из u в v, то считают d(u,v)=∞. Расстояние от u до u равно нулю.

Для сети N возникает задача нахождения расстояния d(u,v) для данных вершин u и v и соответствующего кратчайшего пути. Известно несколько способов решения этой задачи. Мы рассмотрим один из них, основой которого является алгоритм Дейкстры. Он вычисляет расстояние от фиксированной вершины v0 до всех остальных вершин сети.

Прежде, чем привести описание алгоритма, введем необходимые обозначения. Пусть N=(G,α) – сеть, v0 – фиксированная вершина этой сети, v1,…,vm – остальные вершины. На множестве пар вершин (u,v) введем функцию L(u,v) следующим образом:

L(u,v)=

α(e), если e – дуга с началом в u и концом в v,

∞ – если такой дуги не существует.

В описании алгоритма участвует еще некоторое подмножество S множества V вершин графа. В ходе выполнения алгоритма вершины последовательно исключают из S, до тех пор, пока не останется ни одной, и вычисляют величины d(vi), равные кратчайшему пути из v0 в vi , не содержащему вершин из S. Алгоритм также имеет графическую реализацию, в которой множеству S соответствуют неокрашенные вершины, а окрашивание – это исключение вершины из S. Итак, дадим формальное описание алгоритма Дейкстры.

Шаг 1. (инициализация). Положить S:=V\{v0} (то есть окрасить вершину v0), d(vi)= для всех i=1,…,m, положить y= v0.

Шаг 2. Для всех vS (т.е. для всех неокрашенных вершин) пересчитать d(v) по формуле: d(v) =min{ d(v), d(y)+L(y,v)} . Если все d(v)= ∞, перейти к шагу 5 (это означает, что в графе отсутствуют пути из v0 в неокрашенные вершины).

Шаг 3. Выбрать в S вершину w, для которой величина d(v) минимальна, и положить S:=S\{w}, т.е. окрасить вершину w. Окрасить дугу, ведущую в вершину w из вершины, которая была взята в качестве y последний раз, когда в менялось значение d для вершины w . Положить y= w. Если S не пусто, перейти к шагу 2, иначе к шагу 4.

Шаг 4. Конец работы алгоритма.

При графической реализации алгоритма для графа будет построено покрывающее дерево с корнем в вершине v0 (если оно существует). Если требуется определить не сам кратчайший путь, а лишь его длину, то можно не проводить окрашивание, а только вычислять на каждой итерации множество S . Расчет условно оформлять в виде таблице, как показано в следующем примере.

Пример 1. Для графа, изображенного на рис. 37, найти расстояния от вершины v0 до остальных вершин и построить дерево кратчайших путей с корнем в v0 .

Рис. 37.

Работа алгоритма будет иллюстрироваться заполнением приведенной ниже таблицы. Кроме того, для каждой строки таблицы приводится рисунок, соответствующий графической реализации алгоритма; на этом рисунке окрашенные вершины изображаются черным кружком, окрашенные ребра выделены жирными линиями.

y

d(v1)

d(v2)

d(v3)

d(v4)

d(v5)

Рисунок

0

v0

Рис.38

1

v0

4

1

Рис.39

2

v2

3

5

Рис.40

3

v1

4

5

8

Рис.41

4

v3

5

8

Рис.42

5

v4

8

Рис.43

Строка с номером ноль соответствует состоянию переменных после выполнения шага 1. Клетка d(vi) заполняется только для вершин, входящих в S. Пока это все вершины, кроме v0. Строка номер 1 показывает состояние переменных после выполнения шага 2. Действительно, L(v0, v1)=4 (см. рис.37), следовательно, новое значение для d(v1) есть min(4, ∞)=4. Аналогично вычисляются остальные значения d(vi). Наименьшим из них является d(v2)=1 (выделено жирным шрифтом), следовательно, на шаге 3 вершина v2 будет принята в качестве w, окрашена и исключена из S. Значение d(v2) изменилось последний раз при переходе от строки 0 к строке 1, в строке 1 стоит y= v0, значит, окрашиваем ребро, ведущее из v0 в v2 (см. рис. 39). После этого присваиваем переменной y значение v2, и, так как есть еще неокрашенные вершины, переходим опять к шагу 2. На этом первый проход алгоритма заканчивается. Заметим, что d(v2)=1 является расстоянием от v0 до v2.

Рис. 38.

Рис. 39.

Рис. 40.

При втором проходе на шаге 2 снова пересчитываются значения d(vi) для неокрашенных вершин. (Заметим, что фактически значения d(vi) нужно пересчитывать лишь для вершин, которые имеют входящее ребро из вершины y, так как для остальных неокрашенных вершин L(y,vi)=∞ ). Результат приведен в строке 2 таблицы. Минимальным является d(v1)=3, поэтому на шаге 3 вершина v1 будет окрашена и исключена из S. Кроме того, будет окрашено ребро, соединяющее v2 и v1 (рис. 40). После этого переменная w получает значение v1 и мы снова переходим ко второму шагу.

На третьем проходе алгоритма после пересчета d(vi) окрашивается вершина v3 и ребро, ведущее в неё из вершины v1 (рис. 41).

Рис. 41

Рис. 42

Рис.43

На четвертом проходе получаются значения, приведенные в строке 4. Минимальным является d(v4)=5. Последний раз значение d(v4) менялось при переходе от строки 1 к строке 2, в строке 2 было y=v2 , следовательно, нужно окрасить ребро, соединяющее v2 с v4 (рис. 42). Аналогично, на пятом проходе окрашиваем ребро, соединяющее v5 с v1. На этом работа алгоритма заканчивается, получившееся дерево кратчайших путей показано на рис. 43, расстояния от до остальных вершин выделены в таблице жирным шрифтом.

Алгоритм Дейкстры может быть применен и для поиска кратчайшего пути в неориентированном графе, для этого нужно в определении функции L(u,v) учитывать все ребра.

Пример 2. Найти расстояния от вершины v1 до остальных вершин и построить дерево кратчайших путей для следующего графа:

Результаты работы алгоритма приведены в таблице, дерево кратчайших путей – на рис. 44.

N

y

d(v2)

d(v3)

d(v4)

d(v5)

d(v6)

d(v7)

d(v8)

d(v9)

0

v1

1

v1

2

4

3

2

v2

4

3

12

3

v4

4

10

12

16

4

v3

10

12

16

5

v5

12

16

22

6

v6

16

22

28

7

v7

22

26

8

v8

24

Рис. 44.