Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Diskretnaya_matematika.pdf
Скачиваний:
1262
Добавлен:
12.03.2015
Размер:
2.47 Mб
Скачать

145

В других дорогах нет твоей, а в твоей содержатся все дороги.

П. Коэльо

§ 11. Задача о минимальном соединении

Пусть имеется n городов. Требуется соединить их телефонной или газовой сетью, но так, чтобы минимизировать, например, суммарную длину телефонного кабеля или газопроводов соответственно.

Очевидно, что если соединение имеет минимальную длину, то циклов не должно быть. Следовательно, требуется построить на заданных вершинах дерево, обладающее минимальной суммой длин ребер. При достаточно большом числе вершин перебрать все возможные деревья невозможно (слишком их много) даже с помощью ЭВМ, поэтому необходимо разработать процедуру, приводящую к решению за приемлемое время.

В терминологии теории графов эту задачу можно сформулировать следующим образом. Дан связный взвешенный граф G(V,X) для каждого ребра u=(v,u) которого определен вес (длина) (v,u). Задача о минимальном соединении состоит в построении остовного подграфа Т (связного подграфа

Т, содержащего все вершины G) и такого, чтобы его мера (T)= (v,u)

( v ,u ) T

была минимальной. Очевидно, Т должно быть деревом.

Для решения сформулированной задачи известны различные алгоритмы. Рассмотрим алгоритм Краскала (Kruskal).

Построение начинается с выбора кратчайшего ребра Т1=Е1 в G. На каждом последующем i-м шаге, i 2, добавляется к Тi-1 такое ребро Ei, что оно является кратчайшим из оставшихся и получающийся граф Тi не имеет циклов. Если имеется несколько таких ребер одинаковой длины, то можно выбирать любой из них.

Докажем, что Тn-1 является остовным подграфом с минимальной мерой. Тn-1, не имеет циклов и содержит n-1 рёбер, следовательно, является деревом, связывающим все вершины графа.

Пусть Т является деревом, содержащим (покрывающим) все вершины графа G, и Т имеет минимальную меру (Т)(S), S – любое дерево, покрывающее все вершины. Если Т= Тn-1, то утверждение доказано.

Допустим, что ТТn-1. Считаем, что рёбра дерева перенумерованы в том порядке, в котором они присоединялись к Тn-1 при его построении. Так как ТТn-1, то в Тn-1 найдется хотя бы одно ребро, не содержащееся в Т. Пусть Еi - первое такое ребро (в перенумерованной последовательности рёбер), тогда граф Т Еi будет иметь цикл С. Так как Тn-1 не имеет циклов, существует ребро E’ в С, не принадлежащее Тn-1.

Граф Мi=Т Еi \ Етоже будет деревом, покрывающим все вершины графа G. Дерево Т имеет минимальную меру, поэтому (Мi)(Т). По построению Мi и из последнего неравенства имеем: (Мi) = (Т)+ (Еi)- (E’)

(Ei Тn-1,

146

(Т). Тогда (Еi)- (E’)0, поэтому (Еi)(E’). Неравенства (Еi)> (E’) не может быть, так как иначе при построении дерева вместо Еi было бы выбрано Е’, ибо каждый раз выбирается ребро с минимальной длиной, но чтобы не было цикла. При выборе Евместо Еi не было бы цикла, ибо цикл С порожден ими обоими, а выбор одного из них не дает цикла. Поэтому(Еi)= (E’), тогда (Мi)= (Т), так что граф (дерево) Мi также является деревом с минимальной мерой. Но Мi=Т Еi-E’ E’ Тn-1), следовательно Мi имеет больше с Тn-1 ребер, чем Т. Повторяя аналогичным образом, получим (Мn-1)= (Т), что и требовалось доказать.

Указанный алгоритм Краскала можно представить следующим образом:

Вход: список Х ребер графа G с их длинами. Выход: множество Т ребер кратчайшего остова.

Т :=

Упорядочить Х в порядке возрастания длин k := 1 {номер рассматриваемого ребра} for i from 1 to m-1 do

while добавление ребра Е(k) образует цикл в Т do k:=k+1 {пропустить это ребро}

end while

T:=T {E(k)} {добавить это ребро в T}

end

Можно убедиться, что сложность алгоритма Краскала есть 0(mlog2m), где m – число ребер графа.

Рассмотрим работу алгоритма Краскала для графа G, представленного на рис. 5.21, а) [11]. Длины ребер графа представлены на этом рисунке. На первом шаге выбирается ребро длины 1, на втором – добавляется ребро длины 2. На третьем шаге – добавляется ребро длины 3; а на четвертом шаге

– ребро длины 4. Затем добавляется ребро, имеющее длину 5. Теперь нужно выбрать последнее ребро. Ребер длины 6 в данном графе четыре. Если выбрать ребро CF либо BD, то получим цикл. Следовательно, их выбирать нельзя. Из ребер FG и DG можно выбирать любое из них, выберем ребро FG. Указанные шаги алгоритма представлены на рис. 5.21, а).

Для нахождения остовного подграфа с минимальной мерой можно использовать также алгоритм Дейкстры – Прима, являющийся реализацией, так называемого, жадного алгоритма. Жадные алгоритмы используют в каждый момент лишь часть исходных данных и принимают решения на основе этой части. В данном случае на каждом шаге рассматривается только множество ребер, допускающих присоединение к уже построенной части остовного дерева, и выбирается из них ребро с наименьшей длиной (весом). Повторяя эту процедуру, получим остовное дерево с наименьшей мерой.

 

 

 

 

147

 

 

 

A

 

2

B

A

2

 

B

 

 

 

 

 

4

7

6

3

4

7

6

3

5

 

 

8

5

 

 

8

 

 

 

 

C

D

 

Е

C

 

D

Е

 

 

1

6

 

 

1

 

6

 

 

 

 

 

6

 

 

7

6

 

 

7

 

 

 

 

F

6

 

G

F

 

6

G

 

 

 

 

 

 

A

 

2

B

A

2

 

B

 

 

 

 

 

4

7

6

3

4

7

 

 

5

 

 

 

5

 

 

8

 

 

 

 

 

C

D

 

Е

C

 

D

E

 

 

 

 

 

 

1

 

6

 

 

 

 

 

6

 

 

7

F

 

 

G

F

 

6

G

 

 

 

 

 

 

 

A

 

2

B

A

2

 

B

4

7

6

3

4

7

6

3

5

 

 

8

5

 

 

8

C

 

D

E

C

D

 

E

F

 

 

G

F

 

 

G

A

 

2

B

A

2

 

B

4

7

6

3

4

7

6

3

5

 

 

8

5

 

 

8

C

 

D

E

C

D

 

E

1

 

 

 

 

 

 

7

 

 

6

7

 

 

 

 

F

 

6

G

F

 

 

G

A

 

2

B

A

2

 

B

4

7

6

3

4

7

6

3

5

 

 

8

5

 

 

8

C

 

D

E

C

D

E

1

 

 

 

 

 

 

 

 

 

6

7

6

 

 

7

F

6

 

G

F

 

 

G

A

 

2

B

A

2

 

B

4

7

6

3

4

 

 

3

5

 

 

8

5

 

 

 

C

 

D

E

C

D

 

E

1

 

 

 

1

 

 

 

6

 

6

7

 

 

 

 

F

 

6

G

F

6

 

G

 

а)

 

 

 

б)

 

 

 

 

 

 

Рис.5.21

 

 

 

- Прима имеет

148

Разобьем вершины графа на три класса: 1 – вершины, вошедшие в уже построенную часть дерева; 2 – вершины, окаймляющие построенную часть; 3

– ещё не рассмотренные вершины (для полного графа 3-ий класс будет пустым).

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

Более формальная запись алгоритма Дейкстры следующий вид.

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

while в графе есть вершина, не попавшая в дерево do выбрать ребро из дерева в кайму с наименьшей длиной добавить конец ребра к дереву изменить кайму, для чего

добавить в кайму вершины, соседние с новой обновить список ребер из дерева в кайму так,

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

end

Реализация алгоритма Дейкстры - Прима для графа G представлена на рис. 5.21, б): выбранные вершины графа отмечены кружочками, вершины, попадающие в кайму, - штриховыми кружочками; ребра, соединяющие выбранные вершины и вершины каймы, нарисованы жирными штриховыми линиями. Результат применения пятого и шестого шага алгоритма представлен на последнем варианте рисунка.

Алгоритм получает на вход связный граф. В процессе работы алгоритма все вершины, еще не попавшие в дерево, хранятся в очереди с приоритетами. Время работы алгоритма Дейкстры - Прима зависит от того, как организована очередь и может иметь порядок 0(mlog2m), либо - порядок 0(m+nlog2n), где m – число ребер графа, а n - число его вершин.

Сделаем следующее важное замечание. Пусть, например, n городов расположены на равнине (плоскости), а длина ребер есть расстояние между точками. Требуется соединить их телефонной или газовой сетью, но так, чтобы минимизировать суммарную длину телефонного кабеля или газопроводов соответственно. Предложенные алгоритмы решают эту задачу, но если ввести в граф новые вершины (разветвления вне заданных городов), то решение окажется более экономным.

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