Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

dln001

.pdf
Скачиваний:
11
Добавлен:
01.03.2016
Размер:
1.09 Mб
Скачать
делитель весов ребер (дуг) графа

Пусть F r1 множество клеток (вершин графа), образующих фронт волны на текущей итерации; F r2 фронт волны на следующей итерации. Тогда формализованное описание алгоритма имеет вид:

begin

{ Â Î Ë Í Î Â Î É

À Ë Ã Î Ð È Ò Ì }

for v2V

do l(v):=1 ; {Пометить все вершины как свободные}

l(s) := 0 ;

F r1 := adj s ;

{Сформировать начальный фронт и}

for

v2F r1

do l(v) := 1 ;

{пометить его вершины единицами.}

while l(t)=1 do

{Пока фронт волны не достиг вершины t }

8

 

for2

w adj v do

{проверить все соседние вершины}

>

F r2 := ;;

 

 

 

 

 

 

{и если найдется свободная}

 

 

 

if2

 

 

 

 

 

>

for v

F r1 do

{для каждой вершины текущего фронта}

>

8

 

 

 

 

 

 

1

 

 

 

>

 

 

then

 

 

 

 

>

 

 

 

 

 

 

 

>

>

 

8

 

 

 

 

 

 

 

{включить ее во вновь}

>

 

 

 

 

 

 

 

 

<

>

 

 

 

 

l(w)=

 

 

 

 

>

<

 

>

 

 

 

 

 

 

>

 

 

<

 

½

F r2 := F r2+fwg; {формируемый фронт.}

>

F >1

 

 

 

 

 

 

 

 

>

 

>

 

2

 

l(w) := l(v)+1;

 

>

>

 

 

 

 

 

>

>

 

:

 

 

 

 

>

 

 

 

 

 

 

 

 

 

>

:

 

 

 

 

 

 

 

 

 

 

>

{ Â Î Ë Í Î Â Î É

À Ë Ã Î Ð È Ò Ì }

end. >

:

r

:= F r

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.4.2. Графы со взвешенными дугами (ребрами)

Кратчайшие пути и в этом случае можно находить с помощью волнового алгоритма. Пусть r наибольший общий

G: Преобразуем граф, заменив каждое из ребер fvi; vjg простой цепью, состоящей из

ci;j=r ребер единичной длины. Ясно, что в полученном при этом графе G0 полностью сохранятся метрические соотношения, характеризующие расстояния между вершинами графа G: Вместе с тем G0 это граф с ребрами (дугами) единич- ной длины, для которого задача решается по описанной выше схеме. Очевидный недостаток такого подхода 0 высокая трудоемкость èç-çà большой размерности графа G : Действительно число вершин (и ребер) вPпоследнем больше, чем в графе G на величину, равную 1 ci;j¡m: Поэтому исполь-

r

fvi;vjg2E

зуют более эффективные алгоритмы решения задачи. Два из них алгоритмы Дейкстры и Флойда рассмотрены ниже.

81

Алгоритм Дейкстры. Этот алгоритм позволяет найти кратчайший путь между некоторой вершиной s и остальными вершинами при условии, что в графе нет дуг (ребер) с отрицательным весом. Рассмотрим основную идею алгоритма на примере графа G матрицей весов12 C , представленных на

рис. 4.7, взяв в качестве s вершину v5:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v1 v2 v3 v4 v5 v6 v7 v8 v9 v10

 

 

 

 

 

 

 

v1

 

 

 

v2

 

 

 

-

v3

 

v1

3 19

11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s

@

 

s

@

 

s

 

v3

 

13

 

 

 

 

 

 

 

 

 

 

@

6@

 

 

 

I

 

 

 

 

v22

10 7 19

22

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v56

 

 

 

7

 

 

 

 

 

 

 

 

? @R

-R@

 

?

 

 

 

5 14 20

29

23

G

 

v4

 

 

 

 

 

 

 

 

 

 

 

 

v6

C=

6

 

5

2 8

7

 

A

 

 

 

vKA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s

@

 

 

@

 

s

 

v46

 

3

7

 

 

 

 

 

 

 

 

 

 

 

 

s5A

 

 

 

 

v76

 

 

4

7

 

 

 

 

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

7

 

 

 

 

R

? AU

 

 

 

 

 

 

?

 

 

 

6

9

 

 

7

 

 

 

 

 

 

 

v7

A

v8

 

 

 

v9

 

v10

v 6

 

8

7

 

 

 

 

 

 

 

 

s

 

 

 

 

A

 

 

s

 

v86

 

 

7

 

 

 

 

 

 

 

 

 

s

 

 

 

s

 

 

 

 

106

 

 

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

5

 

 

 

 

 

 

 

 

 

-

 

 

 

 

-A -

 

 

 

 

 

 

v96

7

 

6

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ðèñ. 4.7

Выделим все вершины vi2 (v5) и припишем им числовые

метки l(vi);

 

равные весам дуг (v5; vi); как показано на рис. 4.8

(веса проставлены около дуг, а метки около вершин и за-

 

 

 

min=(5)

 

(14)

ключены в круглые скобки). Оче-

 

 

 

 

видно, что кратчайший путь до

 

 

 

 

 

v2

 

v3

 

 

 

 

 

 

s6

 

s

v2

состоит из единственной ду-

 

 

 

 

 

 

 

ãè (v5

; v2); а его длина l(v2)=5:

 

 

 

 

5

 

 

14

 

 

Зафиксируем эту вершину и бу-

(20)

 

 

 

 

 

 

 

 

(29)

äåì

считать ее

метку постоян-

 

 

20

 

 

29

-

v4 s

 

vs5

 

 

sv6

ной. Таким образом, для v2 çàäà-

 

 

 

23

 

0

¤

 

 

ча решена. Относительно осталь-

 

 

 

 

 

 

 

ных четырех вершин можно лишь

 

 

 

 

 

 

 

 

 

 

утверждать, что длины кратчай-

 

(23) vs8

 

 

 

 

 

 

ших путей до них не превос-

 

 

 

 

Ðèñ. 4.8

 

 

ходят

значений

l(vi): Поэтому

 

 

 

 

 

 

соответствующие метки пока счи-

 

 

 

 

 

 

 

 

 

 

таем временными. В дальнейшем, чтобы различать постоян- ные и временные метки, постоянные будем заключать в рамку.

12Пустые клетки в матрице означают, что соответствующих дуг в графе нет. Можно считать также, что дуги есть и каждая имеет вес 1 .

82

ðèì äóãè

Выделим все вершины vi2 (v2)=fv1; v3; v4; v6g и рассмот- (v2; vi) (изображены на рис. 4.9 тонкими линиями).

Поскольку l(v2)+c(v2; v3)<l(v3); "обходной" путь (v5; v2; v3)

короче, чем "прямой"

(v2

; v3) ,

 

 

 

 

 

 

 

 

 

 

поэтому

 

çà

новое

значение

(15)

 

 

 

 

 

5 ¤ min=(12)

метки

 

l(v

)

примем

сумму

 

v1

10

 

v2

v3

 

 

 

3

 

 

 

 

 

 

 

 

 

s6@@

7 -

s

l(v2)+c(v2

; v3)=12: Аналогич-

 

19

¡¡

 

 

 

 

ной проверкой устанавливаем,

 

 

 

 

 

 

22

 

что прямой путь (v5; v4) êî-

(20)

¡¡

 

 

 

@@

роче, чем обходной

(v5; v2; v4);

 

ª¡

 

 

 

 

 

 

R@ (27)

следовательно, значение метки

v4

s

 

 

 

 

vs5

-

sv6

l(v4)

сохраняется

прежним.

 

 

 

 

0

 

 

Для вершины v6;

êàê è äëÿ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v3; метка корректируется и

 

 

 

 

 

 

 

 

 

принимает значение 27. Кроме

 

(23) vs8

 

 

 

 

 

 

вершин v3; v4

è v6; доcтижимых

 

 

 

Ðèñ. 4.9

 

 

èç v5

непосредственно,

åñòü

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

еще одна вершина v1; единственный путь к которой лежит через постоянно помеченную v2: Поэтому в качестве значения

метки для нее естественно взять сумму l(v2)+c(v2; v1):

Будем

 

 

 

 

 

 

 

 

 

 

 

 

говорить,

что теперь

метки

min=(15)

 

 

5

 

12 ¤

l(v1); l(v3) è l(v6) получены из

 

v1

 

 

v2

 

v3

вершины

v2: Из пяти времен-

 

 

 

 

 

 

 

 

-

 

 

 

ных меток минимальной явля-

 

s

 

@s6

 

 

s

 

 

åòñÿ

l(v3)=12;

которая и опре-

 

 

 

 

 

 

@

 

 

13

 

 

 

(20)

 

 

 

 

 

@

 

 

 

?(25)

деляет длину кратчайшего пу-

 

 

 

 

 

@

 

 

òè äî

 

Так как метка по-

 

 

 

 

 

 

 

 

R@

 

 

 

v3:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v4

s

 

 

vs5

 

-

 

sv6

лучена из v2; путь имеет вид

 

 

 

 

0

 

 

 

 

 

(v5; v2; v3):

Таким образом, за-

 

 

 

 

 

 

 

 

 

 

дача решена и для v3; êîòî-

 

 

 

 

 

 

 

 

 

 

 

 

рая становится постоянно по-

 

(23) vs8

 

 

 

 

 

 

 

 

меченной. Этот факт отражен

 

 

 

Ðèñ. 4.10

 

 

 

 

 

на рис. 4.10. Кроме уже рас-

 

 

 

 

 

 

 

 

смотренных дуг, изображена и

 

 

 

 

 

 

 

 

 

 

 

 

единственная дуга, выходящая из v3

: Наличие этой дуги тре-

бует пересчета метки l(v6): Òàê êàê l(v3)+c(v3; v6)<27;

çà íî-

вое значение l(v6) примем сумму l(v3)+c(v3; v6)=25: Минимальной среди временных меток является l(v1)=15: Ýòî çíà-

83

чит, что выявлен кратчайший путь (v5; v2; v1); а метка вершины v1 становится постоянной. Последующие действия выполняются аналогично. Для v1; как последней постоянно поме-

ченной, находим множество вершин (v1)=fv4; v5; v7g и анали-

 

 

 

 

 

 

 

 

 

15 ¤

 

 

 

 

 

 

 

зируем их метки, принимая во

 

 

 

 

 

 

 

 

 

 

 

5

 

 

12

внимание длины дуг, связыва-

 

 

 

 

 

 

 

 

v1

 

v2

 

v3

þùèõ v1 с этими вершинами.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s@19

 

 

@s6

 

s

Òàê êàê l(v1)+c(v1; v4)<l(v4);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 @

 

 

@

 

 

метка вершины

v4

корректи-

 

 

 

 

 

 

 

 

 

 

 

@

 

 

@

 

 

руется, становясь равной 18.

min=

 

 

(18)

 

 

 

@

 

 

 

@

 

?(25)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

@R

 

 

@R

 

У вершины

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

v5 метка посто-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v4

s

 

vs5

 

 

sv6

янная и поэтому не меня-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

0

 

 

 

ется. Наконец,

v7;

äî

этого

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

не рассматривавшаяся,

ïîëó-

 

 

 

 

 

 

vR7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v8 (23)

 

 

 

чает начальную метку, равную

 

 

 

 

(25)s

 

s

 

 

 

 

 

 

l(v1)+c(v1; v7)=25: Ãðàô, îòðà-

 

 

 

 

 

 

 

 

 

 

 

 

Ðèñ. 4.11

 

 

 

жающий ситуацию, представ-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

лен на рис. 4.11. Здесь

ìèíè-

мальной

 

 

временной

меткой

оказывается d(v4)=18: Теперь

вершина v4

становится постоянно помеченной. Так как свою

метку она получила из

v1; кратчайший путь к ней состоит

из кратчайшего пути до

 

v1

è äóãè (v1; v4) и выглядит как

(v5; v2; v1; v4); а его длина равна 18.

 

 

 

 

Итерационный процесс продолжается до тех пор, пока конечная вершина искомого кратчайшего пути не станет постоянно помеченной. Если же требуется найти кратчайшие пути до всех вершин, итерации выполняются, пока все вершины не получат постоянные метки.

Обработку данных в соответствии с алгоритмом целесообразно оформлять в виде таблицы (см. табл. 4.2), строки которой соответствуют итерациям, а столбцы вершинам графа и отражают процесс изменения их временных меток вплоть до момента, пока временная метка не станет постоянной. Два дополнительных столбца таблицы p è l(p) нужны, чтобы зафиксировать вершину, которая становится постоянно поме- ченной на очередной итерации, и длину кратчайшего пути до этой вершины.

84

вершины множества

В табл. 4.2 содержатся результаты расчетов для разобран-

ного выше примера. Покажем, как она заполняется.

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица 4.2

 

 

Èòå

v1

v2

v3

v4

v5

v6

v7

v8

v9

v10

p

l(p)

 

 

ðà

 

 

öèè

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

1

1

1

0

1

1

1

1

1

v5

0

 

 

2

1

5

14

20

 

29

1

23

1

1

v2

5

 

 

3

15

 

12

20

 

27

1

23

1

1

v3

12

 

 

4

15

 

 

20

 

25

1

23

1

1

v1

15

 

 

5

 

 

 

18

 

25

25

23

1

1

v4

18

 

 

6

 

 

 

 

 

25

23

21

1

1

v8

21

 

 

7

 

 

 

 

 

25

23

 

29

1

v7

23

 

 

8

 

 

 

 

 

25

 

 

29

1

v6

25

 

 

9

 

 

 

 

 

 

 

 

27

33

v9

27

 

 

10

 

 

 

 

 

 

 

 

 

33

v10

33

 

 

pred

v2

v5

v2

v1

v5

v3

v4

v4

v6

v6

 

 

 

На первой итерации полагаем временные метки для всех вершин, кроме начальной, равными 1; а для начальной 0.

Последней постоянно помеченной считаем вершину v5; а ее метку равной 0.

На второй итерации, используя матрицу C; находим все

(v5) и пересчитываем их временные метки по формуле l(vi)= minfl(vi); l(p)+c(p; vi)g: Среди временных меток ищем минимальную. Это метка вершины v2; теперь ее считаем постоянно помеченной.

На третьей итерации находим вершины множества (v2) и пересчитываем их временные метки. Среди всех временных вновь ищем минимальную метку. На этой итерации постоянно помеченной становится вершина v3; è ò. ä.

Процесс заканчивается на десятой итерации, когда постоянную метку получает v10: Результаты длины кратчайших путей содержатся в двух последних столбцах таблицы.

Чтобы находить сами пути, сформируем еще одну строч- ку таблицы pred, в которой для каждой вершины графа указана ее предшественница на кратчайшем пути. С этой целью в каждом столбце отыскиваем самую нижнюю строку с предпоследним значением метки. Например, в первом столб-

85

це это вторая строка, в восьмом пятая. Искомая вершинапредшественница содержится в столбце p найденной стро-

êè. Äëÿ v1 это вершина v2; à äëÿ v8 вершина v4: Теперь для определения самого пути достаточно записать цепочку вершин-предшественниц, начиная с конечной вершины.

Òàê, äëÿ v10 имеем: pred(v10)=v6; pred(v6)=v3; pred(v3)=v2

è pred(v2)=v5: Это значит, что кратчайший путь между v5 è

v10 имеет вид (v5; v2; v3; v6; v10):

Формализованная запись алгоритма Дейкстры, в которой использованы обозначения:

p последняя постоянно помеченная вершина;

l массив числовых меток вершин (длин путей);

pred массив предшествующих вершин 13;

 

 

 

 

post

 

массив признака постояной метки вершины;

 

v¤ вершина с минимальной временной меткой;

 

 

 

может быть представлена в следующем виде:

 

 

 

 

begin

 

 

{ À Ë Ã Î Ð È Ò Ì

Ä Å É Ê Ñ Ò Ð Û }

 

 

p := s

 

 

 

{ s последняя постоянно помеченная вершина }

for v2V do

 

 

 

 

{ Инициализировать : }

l(v) := 1

{ массив числовых меток вершин, }

pred(v) := v

{ массив предшествующих вершин, }

( post(v) := 0

{ массив признака постоянной метки. }

l(p) := 0

 

 

 

 

 

 

 

 

 

post(p) := 1

 

 

 

 

 

 

 

 

 

whle

 

p6=t do

{ Ïîêà t не станет постоянно помеченной, }

8

for

(p) do { для всех вершин множества (p);

gg

 

 

ifv2l(p)+cpv < l(v)

 

 

{метки которых > l(p)+cpv;

>

 

 

then

 

 

 

{ выполнить коррекцию }

>

 

 

 

l(v) := l(p)+c

pv

{ самой метки }

>

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

pred(v) := p

 

{ и предшествующей вершины }

>

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

>

 

 

½

{ Найти минимальную временную метку }

<

Найти

 

 

 

 

 

 

 

 

> p := v¤

v¤

{ и далее считать соответствующую }

>

 

 

 

 

 

{ вершину постоянно помеченной }

> post(p) := 1

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

>

 

(

 

)

 

 

 

{ Вывод массивов

 

è

 

}

output

l,pred

 

 

 

l

pred

>

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

:

 

 

 

 

 

 

 

 

 

 

 

 

end.

 

 

{ À Ë Ã Î Ð È Ò Ì

Ä Å É Ê Ñ Ò Ð Û }

 

 

13Формируется параллельно с массивом d: Значение pred(vi) корректируется при каждом изменении l(vi); принимая значение, равное p .

86

Алгоритм Флойда. Этот алгоритм обеспечивает решение задачи отыскания кратчайших путей для всех Cn2 неупо- рядоченых пар вершин простого графа и всех 2Cn2 упорядоче- ных пар вершин орграфа даже при наличии дуг (ребер) с отрицательным весом. Единственным условием является отсутствие в графе контуров (циклов) с суммарным отрицательным весом. Более того, алгоритм позволяет выявить эти контуры.

Пронумеруем вершины графа числами 1; 2;:::;n и обозна-

чим через

dij(m)

длину кратчайшего пути из вершины i â

вершину j;

который может содержать в качестве промежу-

точных любое подмножество только первых m вершин. Если

между i è j нет пути такого типа, полагаем d(ijm)=1: Естественно также считать, что при отсутствии в графе контуров отрицательного веса все d(iim)=0 при любом m: Теперь элемент cij матрицы C можно рассматривать как длину крат- чайшего пути из i â j без промежуточных вершин, и обозна-

÷àòü d(0)ij ; а длину кратчайшего пути между i è j (без ограничений на промежуточные вершины) обозначать как d(ijn):

Пусть D(m) квадратная матрица порядка n: Ïðè m=0 она совпадает с матрицей C и записывается как D(0): На- чиная с D(0); с помощью алгоритма Флойда формируется

ряд матриц D(1); D(2);:::;D(n); последняя из которых является искомой матрицей длин кратчайших путей между всеми парами вершин. Алгоритм Флойда, как и алгоритм Уоршолла, "работает на месте", т. е. не требуется хранить все матрицы D(m): Каждая последующая матрица в этом ряду получается из предыдущей с помощью простого соотношения:

d(ijm) = minfd(ij1); d(im1)+d(mj1)g;

в основе которого лежит следующее, практически очевидное положение. Длина кратчайшего пути из вершины i в вершину

j; использующего в качестве промежуточных только первые m вершин, не может быть больше длины кратчайшего пути из i â j; использующего в качестве промежуточных только первые 1 вершин, и не более суммы длин двух кратчайших

87

и поэтому могут

путей из i â m è èç m â j; в которых промежуточными могут быть лишь первые 1 вершин. Расчетное соотношение

существенно упрощается, когда m является начальной или конечной вершиной рассматриваемого пути. Тогда имеем:

d(imm) = d(im1); d(mjm) = d(mj1):

Это означает, что m -я строка и m -й столбец не меняются при

переходе от матрицы D(1) к матрице D(m)

не пересчитываться. Если зарание известно, что в графе нет контуров отрицательного веса, то и диагональные элементы матриц также можно не пересчитывать. Отмеченные факты позволяют утверждать, что трудоемкость вычисления любой из матриц D(m) пропорциональна n2¡3n+2: Учитывая, что

для получения результата требуется n итераций, в целом трудоемкость алгоритма можно оценить как O(n3):

В качестве примера найдем матрицу длин кратчайших путей между всеми парами вершин для графа G; изображенно-

го на рис. 4.12 и имеющего матрицу весов C: Полагая D(0)=C;

 

s6@

s

 

 

(0)

2

 

0

3

13

3

 

(1)

2

 

0

3

13

3

 

v1

 

- v2

 

 

 

0

5

10 1

 

 

 

 

0

5

10 1

 

 

 

@

@@R?

 

 

6

7

 

 

6

7

 

 

 

 

 

1 1 0 8

 

 

1 1 0 8

 

G

 

 

 

 

D =C=

1

 

 

 

7

; D =

1

 

 

 

7

;

 

 

s

 

 

 

6

 

 

 

 

 

 

6

 

 

 

 

 

 

s

 

 

 

 

4

 

 

 

 

5

 

 

4

 

 

 

 

5

 

v4

 

v3

3;

 

6 7 15 20 0

7

 

 

6 7 12 17 0

7

 

D(2)=2

1 0

3

13

D(3)=2

1 0

3

11

3;

D(4)=2

18

0

3

11

3

:

6

0

5

8

18

7

 

6

0

5

8

16

7

 

 

6

0

5

8

16

7

 

1 1 0

8

 

1 1 0

8

 

 

15 20

0

8

 

6

7

12 15

0

7

 

6

7

12 15

0

7

 

 

6

7

12 15

0

7

 

6

 

 

 

 

7

 

6

7

 

 

6

7

 

4

 

 

 

 

5

 

4

 

 

 

 

5

 

 

4

 

 

 

 

5

 

Ðèñ. 4.12

с помощью алгоритма Флойда последовательно получаем матрицы: D(1); D(2); D(3); D(4); представленные на рис. 4.12, при-

÷åì D(4) и есть искомая матрица длин кратчайших путей.

В каждой матрице выделены m -й столбец и m -я строка, не подлежащие пересчету на соответствующей итерации.

88

Поскольку веса всех дуг не отрицательны, диагональные элементы матриц постоянны и равны нулю. Кроме того,

åñëè

dim(1)

= 1 , òî

dij(m) = dij(1)

äëÿ âñåõ

j è

åñëè

dmj(1)

= 1 , òî

dij(m) = dij(1)

äëÿ âñåõ

i .

Иными словами, если i элемент выделенного столбца ра-

âåí 1; то все элементы i строки на текущей итерации не изменяются. Аналогичное утверждение справедливо и для выделенной строки. Учет приведенных соотношений позволяет сократить объем вычислений на начальных итерациях, особенно для разреженных графов. Проиллюстрируем это на примере. Второй и третий элементы первого столбца, а также четвертый элемент первой строки матрицы D(0) равны 1 . Поэтому, кроме первого столбца и первой строки, при пере- õîäå ê D(1) сохраняют свое значение элементы второй и третьей строк, а также элементы четвертого столбца. Пересчету подлежат14 ëèøü d(0)4;2=15 è d(0)4;3=20: Чтобы получить, напри-

ìåð, d(1)4;2; достаточно сложить d(0)1;2=5 è d(0)1;4=7; которые находятся в первой строке и первом столбце на позициях, соответствующих пересчитываемому элементу, сравнить найденную сумму с d(0)4;2 и выбрать наименьшее из двух чисел. Получаем

d(1)4;2=12: Точно так же решается задача и для d(1)4;3=17: Нетрудно убедиться, что на второй итерации следует вычислять только d(2)1;3; d(2)1;4 è d(2)4;3; а все остальные элементы матрица D(2)

"наследует" от D(1): Действительно, вторая строка и второй

столбец не изменяются потому, что m=2; а первый столбец и третья строка в силу приведенных выше соотношений. Все три названных элемента получают новые значения, равные соответственно 8, 18 и 15. На третьей итерации считаются

d(3)1;4 è d(3)2;4; а на четвертой d(4)1;2 , d(4)1;3 , d(4)2;3 , d(4)2;1 , d(4)3;1 , d(4)3;2; ïðè-

чем из этих шести три первые сохраняют прежние значения. Если граф имеет дуги с отрицательным весом, целесооб- разно наряду с остальными пересчитывать и диагональные

14Элементы, подлежащие пересчету, в матрицах подчеркнуты.

89

элементы матриц D(m): Появление на некоторой итерации отрицательных значений на главной диагонали матрицы показывает, что в графе есть контур (цикл) с отрицательным весом. В этом случае дальнейшие вычисления теряют смысл, так как в подобных ситуациях алгоритм "не работает".

Кроме длины, для каждого кратчайшего пути необходимо определить и последовательность входящих в него вершин. С этой целью одновременно с матрицей D(m) формиру-

ется матрица "вершин-предшественниц" P(m): Элемент p(i;jm) этой матрцы указывает предпоследнюю вершину кратчайшего (i; j) -пути, который может содержать в качестве промежу-

точных только первые m вершин графа. Вначале для всех i è j полагаем p(0)i;j =i; åñëè cij61= ; è p(0)i;j =0 в противном слу- чае. Далее на каждой итерации матрица P(m) пересчитыва-

ется одновременно с матрицей D(m) с помощью соотношения

pi;j

=

( pi;j(1)

 

в противном случае . m;j

(m)

 

pm;j(1)

;

åñëè di;j(1) > di;m(1) + d(1);

Таким образом, элемент матрицы P(m) корректируется при

каждом изменении соответствующего элемента матрицы D(m): Для нашего примера имеем следующий ряд матриц:

2 0

P(0)

2

3 2

0

P(1)

2

3 2

0

P(2)

2

3 2

0

P(3)

3

3 2

4

P(4)

3 3

0

2

0

2

0

2

0

2

0

2

6

0

1

1

0

7;6

0

1

1

0

7;6

0

1

2

2

7;6

0

1

2

3

7;6

0

1

2

3

7;

0

0

3

3

0

0

0

3

0

0

0

3

0

0

0

3

4

1

0

3

6

4

4

4

0

7 6

4

1

1

0

7 6

4

1

2

0

7 6

4

1

2

0

7 6

4

1

2

0

7

6

7 6

7 6

7 6

7 6

7

4

 

 

 

 

5 4

 

 

 

 

5 4

 

 

 

 

5 4

 

 

 

 

5 4

 

 

 

 

5

где подчеркнуты элементы, которые на очередной итерации получают новые значения. Например, как было показано ранее, на первой итерации в матрице D изменились элемен-

òû d4;2 è d4;3: Поэтому согласно с приведенному выше соотношению элементы p4;2 è p4;3 матрицы P получают новые значения, равные p1;2 è p1;3 соответственно. И вообще, на m-й итерации изменяющийся элемент матрицы получает значение, равное элементу, находящемуся в том же столбце на

90

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]