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

3. Барашев В.П., Унучек С.А. Дискретная математика

.pdf
Скачиваний:
23
Добавлен:
23.06.2023
Размер:
2.32 Mб
Скачать

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

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

l

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

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

 

 

 

 

v

 

 

 

2 s1

1.

v0

s

 

 

 

 

 

T1

 

 

 

 

v

 

 

 

2 s1

2.

 

s

 

 

sv2

v0

2

 

 

 

 

 

 

T2

Возьмем вершину v0 и ребро, инцидентное данной вершине и имеющее наименьший вес. Таких ребер два. Возьмем любое из них, например, {v0, v1}. Получили дерево

T1.

Из ребер, смежных с ребром {v0, v1}, наименьшую длину имеет ребро {v0, v2}. Включив его в остов, получаем дерево T2.

 

 

 

v

 

3.

 

2 s1

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

 

 

 

 

v0

s@@2

sv2

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

 

 

3@

 

 

@s

v3

T3

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

 

 

 

 

sv2

 

 

@

 

2

 

v

 

@ v

v0 s@@

 

 

4 s@@4

3

4 s

7

3

 

vs3

 

vs6

 

 

@@

@@

 

T

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

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

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

l

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

192

 

 

 

 

v3

 

 

 

 

 

 

 

 

 

 

@s

@

 

 

 

 

 

 

 

v1

6

6

 

 

 

 

 

 

 

 

@ v6

 

 

 

 

 

 

 

4

 

@

 

 

 

 

4

@s

@6

6 @s

@

4

 

 

 

 

 

@ v4

 

 

 

 

@

 

 

 

 

 

@

 

 

 

 

@

 

v0

s@@

5

@s

@

5

 

 

sv8

4@

 

6

6

 

 

4

 

 

@

 

 

 

 

@

 

4

 

@

 

 

 

 

 

 

 

@

 

 

 

 

 

 

 

 

 

vs2 @

vs7

 

 

 

 

 

 

 

5@@s 5

 

 

 

 

 

 

 

 

 

v5

 

 

 

 

 

 

Решение.

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

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

Ребра длины 4: {v0, v1}, {v0, v2}, {v1, v6}, {v2, v7}, {v6, v8}, {v7, v8}; Ребра длины 5: {v0, v4}, {v2, v5}, {v4, v8}, {v5, v7};

Ребра длины 6: {v1, v3}, {v1, v4}, {v2, v4}, {v3, v6}, {v4, v6}, {v4, v7}.

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

 

vs3

 

 

vs1

vs6

v0 s

vs4

sv8

 

vs2

vs7

 

vs5

 

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

193

 

vs3

 

 

v

v

4

s1

s6

v0 s

vs4

sv8

 

vs2

vs7

 

vs5

 

4.Включаем в остов ребра {v0, v2}, {v1, v6}, {v2, v7} и {v6, v8}, так как они не образуют цикла с ребром {v0, v1}. Ребро {v7, v8} с весом 4 в остов не включаем. Количество ребер в дереве равно 4.

 

 

 

vs3

 

 

 

v1

4

v6

 

 

s

 

s@@4

4

vs4

 

v0 s

 

 

 

@@sv8

 

v

s2

4

v

s7

 

vs5

 

 

 

 

 

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

@@s

 

 

 

 

 

 

 

 

 

v5

 

 

 

 

6.Переходим к ребрам с весом 6. Ребро {v1, v3} включаем в остов. Количество ребер в дереве равно 8, что на 1 меньше количества вершин.

 

 

 

 

 

v

 

 

 

 

 

 

 

 

 

s3

 

 

 

 

 

 

v1

6

 

v6

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

4

 

s

 

 

 

 

s@@4

 

 

 

 

 

 

 

v4

@

 

 

 

 

 

 

 

 

 

 

 

@

 

v0

s@@

5

 

 

s

 

 

 

sv8

4@

 

 

4

 

 

 

 

 

 

@

 

 

 

 

 

 

 

 

 

@

 

 

vs7

 

 

 

 

vs2

@

 

 

 

 

 

 

 

 

5@@s

 

 

 

 

v5 T

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

= 5 × 4 + 2 × 5 + 1 × 6 = 36.

l

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, v3}, 3), ({v1, v6}, 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}, 5), ({v2, v5}, 3), ({v3, v6}, 2), ({v4, v6}, 2), ({v4, v8}, 5), ({v4, v7}, 3), ({v5, v7}, 3), ({v6, v8}, 5), ({v7, v8}, 4).

2.Найти остов минимальной длины графа G, в котором длины ребер равны соответствующим элементам aij матрицы A.

 

 

 

 

 

@s

 

 

a24

 

@s

 

 

 

 

 

 

 

 

 

 

 

a14

@

 

 

a36

@

 

 

 

 

 

 

 

 

 

 

 

 

 

@a25

 

 

 

 

@a46

 

 

 

 

 

 

 

 

 

 

a15

 

@@@

 

a41

 

@@@

 

 

 

 

a11

@s @

 

 

a26

@s

@

 

 

a51

@s

@

 

 

 

 

 

@a16

 

 

 

 

@a42

 

 

 

 

@a55

 

 

 

 

@

 

 

 

 

a32 @

 

 

 

 

 

 

 

 

@

 

 

 

a

12

@

@

a

31

 

 

 

@

@

 

a

52

 

@

 

 

 

 

 

 

 

 

 

 

 

 

 

@

 

s@@

 

 

 

a21

@s

@

 

 

 

a43

@s

@

 

 

 

a56

 

s

@a13

 

 

 

 

 

@a33

 

 

 

 

 

@a53

 

 

 

 

@@@

 

a22

 

@@@

 

a44

 

@@@

 

 

 

 

 

s@@

 

 

a34

@s

@

 

 

 

 

 

s

 

 

 

 

 

 

 

@a23

 

 

a35

@a45

 

a54

 

 

 

 

 

 

 

 

 

 

@@@

@@@

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

3. A =

 

5

5

6

4

4

5

;

1 5 6

2

5

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

4

5

2

5

1

 

 

 

2

4

4

3

3

4

 

 

4

2

2

4

3

2

 

 

 

 

 

 

 

 

 

4. A =

 

4

2

4

2

5

4

.

3 2 5

2

3

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

5

2

2

2

5

 

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

1.

1. l = 16;

2. l = 32;

3. l = 23;

2.

1. l = 55;

2. l = 43;

3. l = 37;

4. l = 30.

197

Глава 11

Алгоритм поиска кратчайшего пути во взвешенном графе.

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

Даны населенные пункты A, B, . . . , S, связанные сетью автодорог. Известна стоимость проезда между каждыми двумя пунктами N и M, связанными дорогой. Требуется найти такой маршрут из A в S, чтобы стоимость проезда была бы наименьшей.

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

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

На языке графов задача формулируется следующим образом: Требуется найти маршрут из вершины 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}. Выбираем вершину vis, расстояние до которой от v0 наименьшее. Делаем вершину vis постоянной. Остальные вершины (за исключением v0) - временные.

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

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

Если найденное расстояние меньше, чем значение метки вершины (ρ(v0, vin) < λ(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