Материал: Решение задач теории графов методические указания к практическим занятиям по дисциплине «Дискретная математика». Белецкая С.Ю

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

(s..., Qn(t)..., Q(Q(t)), Q(t),t),

Qn(t)= Q(Q(...Q(t)) (n раз).

Перед началом работы алгоритма начальная вершина s имеет постоянную метку l(s)=0, а метки всех остальных вершин равны бесконечности (∞) и являются временными. Обозначим через p последнюю из вершин, получивших постоянную метку.

Алгоритм Дейкстры включает следующие шаги:

1. Положить l(s)=0 и считать эту метку постоянной. Положить l(xi)= ∞ для всех xi  s, и считать эти метки временными. p = s.

2. Обновление пометок. Для всех вершин xi  Г(p), пометки которых временные, изменить пометки в соответствии с правилом:

l(xi)=min { l(xi), l(p) +w(p, xi) }.

Если l(xi)> l(p) +w(p, xi), то Q(xi) = p.

3. Если l(xi)= ∞ для всех вершин xi, пометки которых временные, то в исходном графе отсутствуют пути из вершины s в вершины с временными метками. Останов алгоритма. В противном случае переход к шагу 4.

4. Превращение пометок в постоянные. Среди всех вершин с временными метками найти такую вершину xi* , для которой l(xi*) = minl(xi) (метка минимальная) и считать эту пометку постоянной. Положить p=xi*. Пометку Q(xi*) также считать постоянной.

5. Если p  t, перейти к шагу 2, а если p = t, то l(p) - длина кратчайшего пути из s в t.

После определения длины кратчайшего пути сам кратчайший путь восстанавливается по постоянным меткам Q(xi).

5.2. Пример

Для взвешенного орграфа найти кратчайший путь из вершины s в вершину t.

Рис. 17

1. Помечаем в соответствии с алгоритмом вершины графа:

l(s) = 0 ,

l(a) = ∞ ,

l(b) = ∞ ,

l(c) = ∞ ,

l(d) = ∞ ,

l(t) = ∞ .

Вершине s приписываем постоянную пометку, т.е. p = s.

2. Из вершины s помечаем остальные вершины:

l(a) = min {∞, 0 + 4} = 4,

l(b) = min {∞, 0 + 7} = 7,

l(c) = min {, 0 + 3} = 3,

l(d) = ∞ ,

l(t) = ∞ .

У вершин a, b, и с уменьшились пометки, следовательно

Q(a) = s, Q(b) = s, Q(c) = s.

Вершине c приписываем постоянную пометку, т.е. p = c. Пометка Q(с)=s также становится постоянной.

3. Из вершины c помечаем остальные вершины:

l(a) = min {4, 3 + } = 4,

l(b) = min {7, 3 + ∞} = 7,

l(d) = min {∞, 3 + 3} = 6,

l(t) = ∞ .

У вершины d уменьшилась пометка, следовательно Q(d) = c.

Вершине a приписываем постоянную пометку, т.е. p = a. Пометка Q(a)=s становится постоянной.

4. Из вершины а помечаем остальные вершины:

l(b) = min {7, 4 + 4} = 7,

l(d) = min {6, 4 + 3} = 6,

l(t) = ∞ .

Вершине d приписываем постоянную пометку, т.е. p = d.. Пометка Q(d)=c становится постоянной.

5. Из вершины d помечаем остальные вершины:

l(b) = min {7, 6 + } = 7,

l(t) = min {∞, 6 + 2} = 8,

У вершины t уменьшилась пометка, следовательно Q(t) = d.

Вершине b приписываем постоянную пометку, т.е. p=b. Пометка Q(b)=s становится постоянной.

6. Из вершины b помечаем вершину t:

l(t) = min {8, 7 + 2} = 8.

Метки l(t) и Q(t)=d становятся постоянными.

7. Восстанавливаем по меткам Q кратчайший путь из s в t:

Путь scdt длиной 8.

Работу алгоритма можно проиллюстрировать таблицей:

Вершина

1

2

3

4

5

6

s

0

-

-

-

-

-

a

4

4

-

-

-

b

7

7

7

7

-

c

3

-

-

-

-

d

6

6

-

-

t

8

8

5.3. Упражнения

Определить кратчайший путь от вершины s до вершины t с использованием алгоритма Дейкстры.

а б

в г

д е

ж з

Рис. 18

6. Определение кратчайших путей между всеми парами вершин графа. Алгоритм флойда

6.1. Теоретические сведения

Алгоритм Флойда  это алгоритм поиска кратчайших путей между всеми вершинами парами вершин графа .

Пусть дан взвешенный орграф с n вершинами и матрицей весов W. Каждый элемент матрицы весов wij равен весу дуги < xi, xj > (если такой дуги нет, то wij=∞ ), а wii = 0  i =1...n.

Предположим, что граф не содержит контуров отрицательной длины. Пронумеруем вершины графа от 1 до n. Обозначим Wk матрицу с элементами wijk, каждый из которых равен длине кратчайшего пути из вершины i в вершину j, который может содержать в качестве промежуточных вершин только первые k вершин графа. Если такого пути не существует, то wij = ∞. W0=W. По матрице W0 вычисляется матрица W1 и т.д. до тех пор, пока не будет определена матрица Wn , cодержащая кратчайшие пути между всеми вершинами графа. Элементы матрицы Wk на k-й итерации вычисляются следующим образом:

wk ij = min{wikk-1 + wkjk-1, wijk-1} ,

где wikk-1 - длина кратчайшего пути из вершины i в вершину k, в которой в качестве промежуточных используются первые k-1 вершины графа.

Для того, чтобы по окончании работы алгоритма можно было быстро построить кратчайший путь, на каждой итерации вместе с матрицей Wk строится матрица Pk, каждый элемент которой pkij равен номеру вершины, предшествующей вершине j в текущем ij пути.

На первой итерации

p0ij=i ,  i,j = 1...n и i  j,

p0ii=0 ,  i = 1...n.

Номера вершин, включаемых в кратчайший путь, определяются следующим образом:

(i ,..., j3, j2, j1, j),

j1=pij n

j2=pij1 n и т.д.

Основные шаги алгоритма:

1. Пронумеровать вершины графа целыми числами. k=0. Определить матрицу W0. Определить матрицу P0, p0ij=i,  i  j, i,j=1...n и p0i,i=0,  i = j =1...n.

2. Если k = n, работа алгоритма закончена (Wn - эта матрица весов кратчайших путей между всеми парами вершин графа, определяемых с помощью матрицы Pn). Если k  n, то k = k+1, переход к шагу 3.

3. Вычислить для всех i,j = 1...n элементы

wk ij =min{wikk-1 + wkjk-1, wijk-1}.

Если wijk-1 < wikk-1 + wkjk-1 , то pkij = pk-1ij . Иначе pkij = pk-1kj.

4. Если для некоторого 1≤ q ≤ n элемент с wqqk < 0, то в графе имеется контур отрицательной длины и работа алгоритма завершается. Иначе перейти к шагу 2.

6.2. Пример

Дан взвешенный орграф G, который содержит положительные и отрицательные веса. Найти кратчайшие пути между всеми вершинами графа.

Рис. 19

Решение

Пронумеруем вершины графа целыми числами (1, 2, 3, и 4) и определим матрицы W0 и P0:

Согласно алгоритму определяем матрицы W1 и P1.

W2 и P2 :

W3 и P3 :

W4 и P4 :

Таким образом, мы получили матрицу весов кратчайших путей W4 между всеми вершинами графа. Определяем их с помощью матрицы P4.

Кратчайшие пути между вершинами:

1 и 2: L(1, 2) = -2, путь : 1-2;

1 и 3: L(1, 3) = 0, путь : 1-2-3;

1 и 4: L(1, 4) = -3, путь : 1-4;

2 и 1: L(2, 1) = 3, путь : 2-3-4-1;

2 и 3: L(2, 3) = 2, путь : 2-3;

2 и 4: L(2, 4) = -1, путь : 2-3-4;

3 и 1: L(3, 1) = 1, путь : 3-4-1;

3 и 2: L(3, 2) = -1, путь : 3-4-1-2

3 и 4: L(3, 4) = -3, путь : 3-4;

4 и 1: L(4, 1) = 4, путь : 4-1;

4 и 2: L(4, 2) = 2, путь : 4-1-2;

4 и 3: L(4, 3) = 4, путь : 4-1-2-3;

Источник: https://studfile.net/preview/16567232/