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

Уч.пособие-по-ОДМ-2012

.pdf
Скачиваний:
54
Добавлен:
10.05.2015
Размер:
2.36 Mб
Скачать

горитм заканчивает работу. Вес остова равен

= 3 × 2 + 2 × 3 + 2 × 4 = 20.

l

Замечание 10.1. При другой нумерации вершин мы получили бы другую последовательность ребер, и остов получился бы отличным от построенного. Несмотря на то, что минимальный остов

не единственнен для данного графа, вес всех полученных остовов будет одинаков.

 

 

 

 

 

 

 

 

 

 

 

 

.

б) Алгоритм Прима.

 

 

 

П

 

 

 

 

 

v1

Возьмем вершину v0

 

 

 

 

 

 

s

.и ребро, инцидентное

 

 

 

 

2

 

 

 

 

данной вершине и имеющее наименьший

1.

v0

s

 

 

 

 

 

вес. Таких ребер два. Возьмем .любое из

 

 

 

 

 

 

 

 

 

 

 

них, например,

Вv0, v1

. Получили дерево

 

 

 

 

T1

 

 

T1.

{

}

А

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

v

Из ребер, смежныхСс ребром {v0, v1},

2. v0

 

 

2 s1

 

2

 

 

v2

наименьшую длину имеет ребро {v0, v2}.

 

 

s

T2

s

Включив его в остов, получаем дерево T2.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v

 

 

 

 

 

 

 

 

2

s1

 

 

 

 

3.

Барашев

 

 

 

 

 

 

 

 

 

 

Следующим включаем ребро {v0, v3}. Об-

 

v0

s@@2

 

 

 

sv2

разовали дерево T3.

 

 

 

 

 

 

3@

@

 

 

 

 

 

 

 

 

 

T3

 

Унучекvs3

 

 

 

 

 

 

 

 

 

МИРЭА

 

 

 

 

 

 

 

 

 

191

 

 

 

v

 

 

2 s1

4.

 

 

 

 

 

 

 

v0

s@@2

sv24 sv4

 

 

3@@s

v3 T4

Опять два ребра, смежных с T3, имеют наименьший вес. Это ребра {v1, v4} и {v3, v4}. Возьмем ребро {v3, v4}.

5. Следующими в остов

последовательно

.

включаем ребра

{v4, v6}, {v6, v7} и {v5, v7}.

 

.

 

 

 

 

 

 

v1

 

 

 

 

 

 

 

 

 

v5

П

 

.

 

2 s

 

 

s@@2

 

 

 

 

 

 

 

 

 

 

@

 

 

 

Барашевl = 3 × 2 + 2 × 3 + 2 × 4 = 20.

 

 

2

 

sv2

Вv

 

@ v

 

 

v0 s@@

 

 

4 s@@4

3

 

4 s

7

 

 

3

 

vs3

 

vs6 .

 

 

 

 

@@

@@

А

 

 

 

 

 

T

 

С

 

 

 

на рисунке.

Унучек

 

 

 

 

 

 

 

МИРЭА

 

6. Все вершины включены в остов, заканчиваем работу алгоритма.

Вес полученного дерева

Пример 10.5. Построить минимальный остов графа, изображенного

192

 

 

 

 

 

v3

 

 

 

 

 

 

 

 

 

 

 

@s

@

 

 

 

 

 

 

 

 

v1

6

6

 

 

 

 

 

 

 

 

 

4

@ v6

 

 

 

 

 

 

 

 

 

@

 

 

 

 

 

 

4 @s

@

6

6 @s

@

4

 

 

 

 

 

 

@ v4

 

 

 

 

@

 

 

 

 

 

 

 

@

 

 

 

 

@

 

 

v0

s@@

5

@s

@

5

 

 

sv8

 

4@

 

6

6

 

 

 

4

 

 

 

 

4

@

 

 

 

 

 

 

@

 

 

@

 

 

 

 

 

 

 

 

@

 

 

 

 

 

 

 

 

 

 

vs2 @

 

vs7

 

 

 

.

 

 

 

 

5@

5

 

 

 

 

 

 

 

 

 

 

vs5

 

 

 

 

 

 

 

 

 

 

 

@

 

 

 

 

 

П

 

 

 

 

 

 

 

 

 

 

 

Решение.

 

 

 

 

 

 

 

 

.

 

Воспользуемся алгоритмом Краскала.

В

 

А

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. Выписываем ребра в порядке возрастания их длин: .

Барашев4

, v6}, {v2, v7}, {v6, v8}, {v7, v8};

Ребра длины 4: {v0, v1

}, {v0

, v2}, {v1

Ребра длины 5: {v0, v4}, {v2

, v5}, {v4, v8}, {v5, v7

};

Ребра длины 6: {v1, v3}, {v1

, v4}, {v2, v4}, {v3, v.6}, {v4, v6}, {v4, v7}.

Унучекvs2 vs7

 

 

2. Включаем в остов все вершины графа.

С

 

 

 

МИРЭА

 

 

 

vs1

vs3

 

vs6

 

 

v0 s

 

 

 

 

s

 

 

 

 

sv8

 

 

 

 

 

v

 

 

 

 

 

 

s

v5

3. Включаем в остов T ребро {v0, v1} - первое ребро из списка.

193

 

 

 

vs3

 

 

 

 

 

 

v

 

v

 

 

 

4

s1

vs4

 

s6

sv8

 

 

v0 s

 

s

 

s

 

 

 

 

 

 

 

 

 

 

v2

 

v7

.

 

 

 

 

 

vs5

 

 

 

 

4. Включаем в остов ребра {v0, v2},

В .

}, так

{v1, v6.}, {Пv2, v7} и {v6

, v8

как они не образуют цикла с ребром {v0, v1

}. Ребро {v7, v8} с весом

4 в остов не включаем. Количество ребер в дереве равно 4.

 

Барашев

 

 

 

 

4 s

vs3

 

 

 

 

 

 

s@@С4

 

 

 

v1

4

v6

 

 

 

УнучекМИРЭА

 

 

v0 s

vs2

vs4

vs7

@@sv8

 

 

 

 

 

4

 

 

 

 

 

s

v5

5.Ребра {v0, v4} и {v2, v5}длины 5 включаем в остов, а ребра {v5, v7} и {v4, v8} - нет (образуются циклы). Количество ребер на данном

этапе работы алгоритма равно 7.

194

 

 

 

 

 

vs3

 

 

 

 

 

 

 

v1

 

4

v6

 

 

 

 

 

 

s

 

 

s@@4

 

 

4

 

 

 

 

 

 

 

 

 

 

 

v4

 

 

@

 

 

 

 

 

 

 

 

 

 

 

 

@

 

v0

s@@

5

 

 

s

 

 

 

 

sv8

4@

 

 

4

 

 

 

 

 

 

 

@

 

 

 

 

 

 

 

 

 

 

@

 

 

vs7

 

 

 

 

 

vs2

@

 

 

 

 

.

 

 

 

 

5@

@

 

 

 

 

 

 

 

 

 

 

vs5

 

 

 

 

6. Переходим к ребрам с весом 6. Ребро {v.1, vП3} включаем в остов.

Количество ребер в дереве равно 8, что на 1 меньше количества

вершин.

 

 

 

 

 

В

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v

 

 

 

 

 

 

 

s3

 

 

 

 

 

v1

6

 

 

v6

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

s@@С4

4

 

s

 

 

 

 

 

 

 

 

 

v4

 

 

@

 

 

 

 

 

 

 

 

 

 

 

 

@

 

v0

s@@

5

 

 

s

 

 

 

 

sv8

4@

 

 

4

 

 

 

 

 

 

 

@

 

 

 

 

 

 

 

 

 

 

@

 

 

vs7

 

 

 

 

 

vs2

@

 

 

 

 

 

 

 

 

 

5@

@

 

 

 

 

 

 

 

 

 

 

 

vs5

 

 

 

 

 

Барашев

 

 

 

 

 

 

 

 

 

 

T

 

 

 

 

 

Минимальный остов построен. Его вес равен

 

Унучекl = 5 × 4 + 2 × 5 + 1 × 6 = 36.

 

МИРЭА

195

10.3Задачи для самостоятельного решения

1. Найти минимальный остов графа, заданного списком взвешенных ребер:

1. ({v0, v1}, 3),

 

({v0, v4}, 3),

 

({v0, v2}, 4), ({v1, v3}, 3),({v1, v6}, 4),

({v1, v4}, 4), ({v2, v4}, 1), ({v2, v7}, 1), ({v2, v5}, 3), ({v3, v6}, 3),

({v4, v6}, 2), ({v4, v8}, 3), ({v4, v7}, 1), ({v5, v7}, 1), ({v6, v8}, 2),

({v7, v8}, 2);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

2. ({v0, v1}, 4), ({v0, v4}, 5), ({v0, v2}, 4),

 

 

 

 

 

({v1

, v6}, 3),

 

({v1, v3}, 3),

 

({v1, v4}, 3), ({v2, v4}, 4), ({v2, v7}, 6), ({v2, v5}, 5), ({v3, v6}, 4),

({v4, v6}, 3), ({v4, v8}, 5), ({v4, v7}, 6), ({v5

, v7

}, 5), ({v6, v8}, 6),

({v7, v8}, 5);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. ({v0, v1}, 4), ({v0, v4}, 4), ({v0, v2}, 4), ({v1, v3

}, 2), ({v1, v6}, 5),

({v1, v4}, 2), ({v2, v4

}, 3), ({v2

, v7

 

 

 

 

 

 

 

А

 

 

, v6}, 2),

}, 5)В, ({v2, v5}, 3),

.({v3

Барашев@

32 @

({v5

 

 

 

 

 

 

 

 

@

 

({v4, v6}, 2),

({v4, v8

}, 5),

 

({v4

, v7

}, 3),

 

, v7

}, 3),

 

({v6

, v8}, 5),

({v7, v8}, 4).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

С

 

 

 

 

 

 

 

 

 

 

2. Найти остов минимальной длины графа G, в котором длины ребер

равны соответствующим элементам aij матрицы A.

 

 

 

 

 

 

 

 

 

 

 

 

Унучек

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

@s

 

 

 

 

a24

 

 

@s

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

@

 

 

 

 

 

 

@

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a14

 

 

 

МИРЭА

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

@a25

a36

 

 

 

@a46

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a15

 

 

@@@

 

a41

 

 

@@@

 

 

 

 

 

 

 

@s @

 

 

 

 

 

 

 

 

@s

@

 

 

 

 

 

 

@s

@

 

 

 

a11

 

 

 

@a16 a26

 

 

a

@a42

a51

 

 

 

 

@a55

 

 

a

12

 

 

 

@

@

a

31

 

 

 

 

 

@

 

 

 

 

a

52

 

 

 

@

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

@

 

 

 

 

 

 

 

 

@

 

s@@

 

 

 

a

 

 

 

@s

@

 

 

 

 

a43

@s

@

 

 

 

 

 

a

 

 

 

s

@a

13

 

 

21

 

 

 

 

 

@a

33

 

 

 

 

@a

53

 

 

 

56

 

@@@

 

 

 

a22

 

 

@@@

 

a44

 

 

@@@

 

 

 

 

 

 

 

 

s@@

 

 

 

 

a

 

 

@s

@

 

 

 

a

 

 

 

s

 

 

 

 

 

 

 

 

 

 

@a

23

 

34

 

 

 

@a

45

 

54

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

@@@

 

a35

@@@

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s

 

 

 

 

 

 

 

 

 

s

 

 

 

 

 

 

 

 

 

 

 

 

196

 

 

7

7

6

7

7

6

 

 

 

 

 

 

6

6

6

4

4

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. A =

 

5

6

3

3

4

5

;

 

 

 

 

5 6 5

3

5

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

4

5

6

7

6

 

 

 

 

 

 

 

6

6

5

6

6

5

 

 

 

 

 

 

5

5

5

3

3

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. A =

 

4

5

2

2

5

4

;

 

 

 

 

4 5 4

2

4

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

3

3

4

5

6

5

 

 

 

 

 

 

 

П

 

 

 

4

4

6

7

6

5

 

 

 

 

3

5

4

1

5

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

5

6

4

4

5

;

 

 

3. A =

1 5 6

2

5

3

.

 

.

 

 

 

 

 

 

 

 

 

В

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

4

5

2

5

1

 

 

 

Барашев

 

 

 

4

2

2

4

3

2

 

 

 

 

2

4

4

3

3

4

 

 

 

 

 

 

 

3

5

2

2

2

5

 

С

 

 

4. A =

 

4

2

4

2

5

4

.

 

 

 

 

3 2 5

2

3

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.

l

= 37;

Унучек

МИРЭА

Ответы к задачам для самостоятельного решения

1.

 

 

 

1.

l

= 16;

 

2.

= 32;

 

 

l

 

 

3.

= 23;

 

2.

l

 

 

1.

l

= 55;

 

2.

= 43;

 

4.

l

= 30.

 

 

l

 

 

197

Глава 11 Алгоритм поиска кратчайшего пути

во взвешенном графе.

.

 

11.1Постановка задачи

 

В

 

А

 

Из-

Даны населенные пункты A, B, . . . , S, связанные сетью автодорог..

Барашев

 

 

 

и M,

вестна стоимость проезда между каждыми двумя пунктами N

связанными дорогой. Требуется найти такой маршрут из A в S, чтобы

стоимость проезда была бы наименьшей.

С

 

 

 

 

.

 

 

Данную задачу, как и большинство задач логистики, можно решать

с помощью графов.

число - его вес. КаждомуМИРЭАнаселенному пункту A, B, . . . , S соответствует вершина графа v0, v1, . . . , vn. Стоимость проезда - вес (длина) соответствующего ребра. Если автосообщения между пунктами нет, то и соответствующее ребро в графе отсутствует.

Рассмотрим простойУнучеквзвешенный граф G, то есть граф без кратных ребер и петель, каждому ребру которого приписано неотрицательное

На языке графов задача формулируется следующим образом: Требуется найти маршрут из вершины v0 в вершину vn графа G такой, что сумма длин ребер, входящих в этот путь, минимальна.

Такой путь обычно называют кратчайшим.

Кратчайший путь удобно находить с помощью алгоритма Дейкстры. Существует несколько версий данного алгоритма, рассмотрим одну из них.

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

198

а) min(n, ∞) = n, n > 0, то есть все целые числа n меньше "\.

б) min(∞, ∞) =

в) n + = + =

В процессе работы алгоритма каждой вершине vi ставим в соответствие метку λ(vi) = ρ(v0, vi) - расстояние от вершины v0 до vi. Длину ребра {vi, vj} обозначим через l(vi, vj).

11.2Алгоритм Дейкстры

 

 

 

.

 

 

 

П

 

.

 

I Прямой ход - нахождение длины кратчайшего пути.

 

 

 

 

.

1. Всем вершинам v0, v1, . . . , vn графа G ставим в соответствие

метку λ(vi) = ∞, i =

0, . . . , n

.

 

 

Барашев

 

 

2. Делаем вершину v0 постояннойВ, заменив её метку на 0

(λ(v0) = 0). Остальные вершины оставляем временными.

3. Рассматриваем все смежные с v0 вершины.Всем вершинам

vik, смежным с v0, меняем величину метки с λ(vik) = на

λ(vik) = l(v0, vik) - длину (вес) ребраС{v0, vik}. Выбираем вер-

шины (ρ(Унучекv0, vin) < λ(vin)), то заменяем величину метки:

шину vis, расстояние до которой от v0

наименьшее. Делаем

вершину vis постоянной. Остальные вершины (за исключением v0) - временные.МИРЭА

4. Находим расстояние от вершины v0 до каждой вершины vin, смежной с vis, вдоль пути, проходящего через вершину vis. Это расстояние равно

ρ(v0, vin) = l(v0, vis) + l(vis, vin).

Если найденное расстояние меньше, чем значение метки вер-

λ(vin) = ρ(v0, vin).

Среди всех вершин выбираем вершину с наименьшим значением метки (наименьшим расстоянием до v0). Данная вершина становится постоянной.

199

5. Пусть вершина vk, имеющая метку λ(vk) = ρ(v0, vk) является постоянной на данном этапе алгоритма. Для каждой вершины vj, смежной с vk, проверяем метку.

Если выполнено неравенство λ(vk)+l(vk, vj) < λ(vj) (или, что то же самое, ρ(v0, vk) + l(vk, vj) < ρ(v0, vj)), то значение метки вершины vj заменяем на λ(vk) + l(vk, vj). Таким образом, величина метки вершины vj уменьшится.

6. Находим временную вершину с наименьшей меткой. Делаем

её постоянной.

 

.

На каждом шаге алгоритма ровно одна временная вершина

 

П

 

(с наименьшей величиной метки) переходит из разряда вре-

менных в разряд постоянных, после чего значение её метки

уже не меняется.

.

 

.

 

 

 

 

 

7. Шаги 5 и 6 продолжаем до тех пор, пока вершина vn не станет

постоянной.

 

А

Барашев

 

8. Если vn - постоянная вершина, Вто величина приписанной ей

 

.

 

метки λ(vn) = ρ(v0, vn) - есть длина кратчайшего пути из v0 в

vn.

 

 

 

 

 

Заметим, что значение меток удобно записывать в таблицу,

помечая постоянную метку. На графе отмечаем только вели-

чины постоянных меток.

 

С

 

 

II Обратный ход - нахождение кратчайшего пути.

 

 

1. Просматривая

смежные с

vn

вершины, находим

реб-

ро {vjs, vn},

для которого

выполнено

равенство

l(vjs, vn) = λ(vn) − λ(vjs),

то

есть длина

ребра

равна

разностиУнучекметок вершинМИРЭАего концов. Вершина vjs входит в кратчайший путь: vn → vjs.

2.Пусть вершина vjk входит в кратчайший путь. Изучая смежные с ней ребра, находим ребро {vjk, vjl}, для которого верно равенство l(vjk, vjl) = λ(vjk) − λ(vjl). Это означает, что вершина vjl также входит в кратчайший путь:

vn → vjs → . . . → vjk → vjl.

3.Продолжаем искать вершины аналогично предыдущему шагу алгоритма, пока не дойдем до вершины v0.

200