
- •Введение
- •Глава 1. Множества, отношения и функции
- •1. Задание множества
- •2. Операции над множествами
- •3. Разбиение множества. Декартово произведение
- •4. Отношения
- •5. Операции над отношениями
- •6. Функция
- •7. Отношение эквивалентности. Фактор-множество
- •8. Отношения порядка
- •9. Вопросы и темы для самопроверки
- •10. Упражнения
- •Глава 2. Алгебраические структуры
- •1. Операции и предикаты
- •2. Алгебраическая система. Алгебра. Модель
- •3. Подалгебры
- •4. Морфизмы алгебр
- •5. Алгебра с одной операцией
- •6. Группы
- •7. Алгебра с двумя операциями. Кольцо
- •8. Кольцо с единицей
- •9. Поле
- •10. Решетки
- •11. Булевы алгебры
- •12. Матроиды
- •13. Вопросы и темы для самопроверки
- •14. Упражнения
- •Глава 3. Булевы функции
- •2. Формулы
- •3. Упрощения в записях формул
- •4. Равносильность формул
- •5. Важнейшие пары равносильных формул
- •6. Зависимости между булевыми функциями
- •7. Свойства операций штрих Шеффера, стрелка Пирса и сложения по модулю два
- •8. Элементарные суммы и произведения. Конституенты нуля и единицы
- •9. Дизъюнктивные и конъюнктивные нормальные формы
- •10. Представление произвольной булевой функции в виде формул
- •11. Совершенные нормальные формы
- •12. Полином Жегалкина
- •13. Сокращенные дизъюнктивные нормальные формы
- •14. Метод Квайна получения сокращенной д.н.ф.
- •15. Тупиковые и минимальные д.н.ф.
- •16. Метод импликантных матриц
- •17. Минимальные конъюнктивные нормальные формы
- •18. Полнота системы функций. Теорема Поста
- •21. Функциональная декомпозиция
- •22. Вопросы и темы для самопроверки
- •23. Упражнения
- •Глава 4. Элементы комбинаторики
- •1. Правило суммы для конечных множеств
- •2. Правило произведения для конечных множеств
- •3. Выборки и упорядочения
- •5. Число всевозможных разбиений конечного множества. Полиномиальная теорема
- •6. Метод включения и исключения
- •7. Задача о беспорядках и встречах
- •8. Системы различных представителей
- •9. Вопросы и темы для самоконтроля
- •10. Упражнения по комбинаторике
- •Глава 5. Теория графов
- •1. Основные типы графов
- •2. Изоморфизм графов
- •3. Число ребер графа
- •4. Цепи, циклы, пути и контуры
- •5. Связность графа. Компоненты связности
- •6. Матрица смежности
- •7. Матрицы смежности и достижимости
- •8. Критерий изоморфизма графов
- •9. Матрица инциденций
- •10. Деревья
- •11. Задача о минимальном соединении
- •12. Центры дерева
- •13. Ориентированные деревья
- •14. Эйлеровы графы
- •15. Гамильтоновы графы
- •16. Планарные графы
- •17. Задача о кратчайшей цепи между произвольными вершинами графа
- •18. Алгоритм Дейкстры нахождения кратчайших путей от заданной вершины орграфа
- •19. Потоки в сетях
- •20. Вопросы и темы для самопроверки
- •21. Упражнения
- •Список литературы
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’)
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 городов расположены на равнине (плоскости), а длина ребер есть расстояние между точками. Требуется соединить их телефонной или газовой сетью, но так, чтобы минимизировать суммарную длину телефонного кабеля или газопроводов соответственно. Предложенные алгоритмы решают эту задачу, но если ввести в граф новые вершины (разветвления вне заданных городов), то решение окажется более экономным.