
- •2. Алгоритмы построения деревьев
- •2.1. Неориентированные покрывающие деревья
- •2.2.Алгоритм построения максимального ориентированного леса
- •3. Алгоритмы поиска путей
- •3.1. Алгоритм поиска кратчайшего пути
- •3.2. Алгоритмы поиска всех кратчайших путей.
- •3.3. Алгоритмы поиска k кратчайших путей
- •4. Потоковые алгоритмы
- •4.1. Определения
- •4.2. Алгоритм поиска увеличивающей цепи
- •4.4. Алгоритм поиска потока минимальной стоимости
- •4.5. Алгоритм поиска максимального динамического потока
- •5. Паросочетания и покрытия
- •5.1. Понятия и определения
- •5.2. Алгоритм решения задачи о паросочетании максимальной мощности
- •5.3. Алгоритм выбора паросочетания максимального веса
- •6. Задача почтальона
- •6.1. Введение
- •6.4. Задача почтальона для смешанного графа
- •7. Сетевые графики. Метод критического пути
- •Контрольные вопросы
- •I. Организационно-методический раздел
- •4. Перечень контрольных вопросов и заданий для самостоятельной работы
- •4. Примерный перечень вопросов к экзамену и зачёту
- •III. Распределение часов курса по темам и видам работ
2.2.Алгоритм построения максимального ориентированного леса
Ориентированное дерево – это дерево, в котором никакие две дуги не заходят в одну и ту же вершину. Исходить из вершины может несколько дуг. Корнем ориентированного дерева называется единственная его вершина, которая не имеет ни одной заходящей дуги. Ориентированный лес – это лес, состоящий из ориентированных деревьев. Покрывающим ориентированным деревом называется ориентированное дерево, включающее все вершины графа. Покрывающим ориентированным лесом называется ориентированный лес, включающий все вершины графа. Вес ориентированного леса (дерева) есть сумма весов входящих в него дуг. Максимальный ориентированный лес (дерево) определяется как лес (дерево) с максимально возможным весом. Минимальный ориентированный лес (дерево) определяется как лес (дерево) с минимально возможным весом.
Лесом называется любая совокупность дуг, не содержащая циклов.
В алгоритме построения максимального ориентированного леса, разработанном Эдмондсом, используются два букета – букет вершин, содержащий просмотренные вершины, и букет дуг, включающий дуги, условно включенные в максимальный ориентированный лес (условно, т.к. на последнем этапе работы алгоритма некоторые из них могут быть исключены). Перед началом процедуры оба букета пусты. Обозначим через G0 исходный граф, а через G1,G2,... и т.д. – графы, которые последовательно получаются из графа G0 в ходе работы алгоритма. Букеты вершин и дуг для соответствующих графов обозначим через V0, V1, V2 , ... и А0, А1, А2, ...
Процедура алгоритма
Положить i=0.
Шаг 1. Если все вершины Gi входят в букет Vi, перейти на шаг 3. В противном случае выбрать в Gi любую вершину v, не входящую в Vi, и включить ее в Vi. Среди дуг, заходящих в вершину v, выбрать дугу γ с максимальным положительным весом. Если такой дуги нет, вернуться на начало шага 1. В противном случае включить γ в Аi. Если после этого Аi остается лесом в Gi, вернуться на начало шага 1, иначе – на шаг 2.
Шаг 2. Поскольку добавление γ к Аi привело к тому, что Аi перестал быть лесом, γ в совокупности с другими дугами из Аi образует контур Сi. Выявить контур Сi и стянуть все дуги и вершины контура в одну вершину vi. Полученный в результате граф считать графом Gi+1. Любая дуга в Gi, инцидентная в точности одной вершине контура Ci, будет инцидентна вершине vi в Gi+1, а вершинами Gi+1, помимо vi, являются все вершины Gi, не входящие в контур Ci. Для всех дуг Gi+1, кроме заходящих в вершину vi, веса остаются прежними. Для каждой дуги (x,y) из Gi, ставшей дугой (x,vi) в Gi+1, положить:
Контуром называется путь, у которого начальная и конечная вершины совпадают.
a(x,vi) = a(x,y) + a(r,s) - a(t,y),
где (r,s) - дуга минимального в контуре Ci веса,
(t,y) - дуга в контуре Ci, заходящая в вершину y.
Сформировать
множество Vi+1,
включив в него все вершины графа Gi+1,
которые содержались в букете Vi
(vi
Vi+1).
Сформировать множество Ai+1,
включив в него все в дуги Gi+1,
которые содержались в Аi
(Сi
Аi+1).
Положить i:=i+1 и перейти на шаг 1.
Шаг 3. Все вершины Gi содержатся в Vi, а дуги букета Ai образуют в Gi ориентированный лес. Если i=0, закончить процедуру алгоритма: дуги букета А0 образуют максимальный ориентированный лес для исходного графа G0. Если i?0, возможны два случая:
а) Вершина vi–1 является корнем некоторого ориентированного дерева в ориентированном лесе, образованном дугами из Аi. В этом случае к дугам букета Ai присоединить дуги контура Ci–1, предварительно удалив из контура Ci–1 дугу наименьшего веса, и тем самым создать новый букет Ai–1. Положить i:=i-1 и – на начало шага 3.
б) Вершина vi–1 не является корнем ни одного ориентированного дерева в лесе, образованном дугами из Аi. Тогда в Ai имеется единственная дуга (x,vi–1), заходящая в vi–1, она соответствует дуге (х,у) в Gi–1, где у - вершина контура Ci–1, стянутого в вершину vi–1. Присоединить к дугам букета Ai дуги контура Ci–1, удалив из контура Ci–1 дугу, заходящую в вершину у, и создать, таким образом, новый букет Ai–1. Положить i:= i-1 и повторить шаг 3.
Пример. Построить максимальный ориентированный лес на графе, изображённом на рис. 2.5.
Рис. 2.5. Граф G0.
Будем рассматривать рёбра исходного графа G0 в алфавитном порядке.
Результат просмотра вершин графа G0 приводится в таблице:
Граф G0 |
Просмотренные вершины |
Букет вершин V0 |
Букет дуг A0 |
|
Сначала пуст |
Сначала пуст |
|
a |
a |
(d,a) |
|
b |
a, b |
(d,a), (c,b) |
|
c |
a, b, c |
(d,a), (c,b), (b,c) |
После просмотра вершины c дуги букета A0 уже не определяют ориентированный лес, т.к. содержат контур (c,b), (b,c), который при выполнении 2-го шага алгоритма, будет стянут в одну вершину v0. Полученный в результате этого стягивания граф G1 изображён на рис. 2.6.
Рис. 2.6. Граф G1.
Результат просмотра вершин графа G1 приводится в таблице:
Граф G1 |
Просмотренные вершины |
Букет вершин V1 |
Букет дуг A1 |
|
a |
(d,a) |
|
d |
a, d |
(d,a), (v0,d) |
|
v0 |
a, d, v0 |
(d,a), (v0,d), (a,v0) |
После просмотра вершины v0 букет A1 представляет собой контур, который при выполнении 2-го шага алгоритма стянется в вершину v1. Полученный в результате граф G2 изображён на рис. 2.7.
Рис. 2.7. Граф G2.
Заметим, что дуга (d,v0) графа G1 превратилась в графе G2 в петлю.
Просмотр единственной вершины графа G2 приводится в таблице:
Граф G2 |
Просмотренные вершины |
Букет вершин V2 |
Букет дуг A2 |
|
Пуст |
Пуст |
|
v1 |
v1 |
Пуст |
Единственная вершина графа G2 входит в букет вершин V2, значит, букет дуг A2 содержит максимальный ориентированный лес для графа G2 (рис. 2.8).
Рис 2.8. Максимальный лес в графе G2.
Как мы видим, это лес, не содержащий дуг. Переходим к третьему шагу алгоритма – разворачиванию вершин vi. Вершина v1 является корнем, поэтому соответствующий ей контур за вычетом дуги (v0,d) минимального веса составит максимальный ориентированный лес для графа G1: (d,a), (a,v0). Этот лес изображён на рис. 2.9.
Рис. 2.9. Максимальный лес в графе G1.
Вершина v0 корнем не является, поэтому соответствующий ей контур войдёт в максимальный ориентированный лес для графа G0 без дуги (b,c), т.к. (a,v0), включённая в формируемый лес, соответствует дуге (a,с). Таким образом, максимальный ориентированный лес для графа G0 содержит дуги: (d,a), (a,с), (c,b). Этот лес, изображённый на рис. 2.10, состоит из одного дерева, и вес его равен 12.
Рис. 2.10. Максимальный лес в графе G0.
Алгоритм построения максимального ориентированного леса является базовым и может быть использован для решения следующих задач:
1. Минимальный ориентированный лес. Для решения этой задачи, прежде чем применить базовый алгоритм, производится изменение знака величины веса, каждой дуги исходного графа на противоположный. Максимальный ориентированный лес для новых весов дуг соответствует минимальному ориентированному лесу для исходных весов дуг.
2. Максимальное покрывающее ориентированное дерево (если, конечно, хотя бы одно покрывающее дерево содержится в соответствующем графе). В этом случае также прежде, чем применить базовый алгоритм, вносятся изменения в исходный граф. А именно, к весу каждой дуги прибавляется достаточно большая положительная константа М, значение М зависит от значений весов дуг графа. Пусть дуга (p,r) максимального веса, дуга (s,t) минимального веса и дуга (u,w) минимального для оставшихся дуг веса. Тогда значение константы М определяется следующим образом:
M > a(p,r) – a(s,t) – a(u,w).
Необходимо отметить, что даже если веса всех дуг положительны и граф содержит покрывающее ориентированное дерево, максимальный ориентированный лес не обязательно является максимальным покрывающим ориентированным деревом.
Например, в графе, изображённом на рис. 2.11, максимальным ориентированным лесом является лес на рис. 2.12. Его вес равен 6. Максимальным деревом в том же графе является дерево с весом, равным 3, приведённое на рис. 2.13.
Рис. 2.11.
Рис. 2.12.
Рис. 2.13.
1. Построение максимального ориентированного леса.
2. Построение максимального покрывающего ориентированного дерева.
3. Минимальное покрывающее ориентированное дерево (также при присутствии в графе хотя бы одного покрывающего дерева). Данная задача решается базовым алгоритмом, если вначале внести в исходный граф изменения, аналогичные произведённым в п. 1, а затем те же, что и в п. 2.
4. Максимальное покрывающее ориентированное дерево с корнем в заданной вершине v (при условии его существования) находится следующим образом. К исходному графу добавляется дополнительная вершина v/ и дуга (v,v/) с произвольным весом. Изменив веса дуг, как в п. 2, и применив базовый алгоритм, мы построим максимальное покрывающее ориентированное дерево с корнем в вершине v/, затем, отбросив вершину v/ и дугу (v,v/), получим искомое.
5. Минимальное покрывающее ориентированное дерево с корнем в заданной вершине v (при условии его существования) находится так же, только предварительное изменение весов дуг производится, как в п.
Обоснование алгоритма построения максимального ориентированного леса.
Покажем, что если ориентированный лес в графе Gn, определяемый букетом An, является максимальным, то максимален и лес, определяемый букетом An–1, в Gn–1.
Пусть G/ - подграф графа Gn–1, включающий все дуги последнего, за исключением дуг, заходящих в вершины контура Cn–1, а G// - подграф графа Gn–1, включающий все дуги последнего, за исключением дуг, вошедших в G/. A/n–1 - дуги из An–1, принадлежащие G/, а A//n–1 - дуги из An–1, принадлежащие G//. A/n–1 образует ориентированный лес в G/, а A//n–1 - в G//. Если An–1 не является максимальным ориентированным лесом в Gn–1, то в нем найдется некоторый ориентированный лес В с большим суммарным весом. В/ - дуги из В, принадлежащие G/, а В// - дуги из В, принадлежащие G//. Так как вес В больше веса An–1, то либо вес В/ больше веса A/n–1, либо вес В// больше веса A//n–1.
Утверждение 1. A//n–1 - максимальный ориентированный лес в G//.
Утверждение 2. Вес A/n–1 равен весу В/.
Из справедливости обоих утверждений следует, что лес An–1 - максимальный в Gn–1. Отметим, что ориентированный лес, формируемый для последнего в алгоритме графа (для графа Gn с наибольшим n), является в этом последнем графе максимальным, т.к. включает только дуги положительного веса, причём максимального среди весов дуг, заходящих в соответствующую вершину.
Доказательство
утверждения 1.
Пусть контур Cn–1
включает m
вершин. В графе G//
для каждой из этих вершин найдется одна
заходящая дуга с положительным весом
(иначе не образовался бы контур Cn–1).
Так как граф G//
состоит из m
вершин, то лес для него не может содержать
более чем m
дуг. Более того, вес любого ориентированного
леса с G//
не может превысить суммарного веса дуг,
составляющих контур Cn–1.
Но никакой лес не может содержать контур
Cn–1
целиком. Поэтому по крайней мере одна
из m
вершин контура Cn–1
в любом ориентированном лесе графа G//
либо вообще не имеет заходящей дуги,
либо имеет заходящую дугу вида (х,у),
где х
Cn–1,
а y
Cn–1.
Построим в G//
для каждой вершины z
контура Cn–1
ориентированный лес Bz
следующим образом:
а) включим в лес Bz все дуги контура Cn–1, за исключением дуги, заходящей в вершину z;
б) включим в лес Bz одну из дуг (х,z), где х Cn–1, именно ту, у которой максимальный положительный вес.
Для каждой дуги (x,y) из Gi, ставшей дугой (x,vi) в Gi+1, положить:
a(x,vi) = a(x,y) + a(r,s) - a(t,y),
где (r,s) - дуга минимального веса в контуре Ci,
(t,y) - дуга в контуре Ci, заходящая в вершину y.
Выберем во множестве {Bz} лес Bz* с максимальным весом. Bz* совпадает с ориентированным лесом, определяемым букетом A//n–1. Это следует из правила пересчета весов дуг, заходящих в контур. Рассмотрим любой ориентированный лес В1 в графе G//, который не совпадает с лесом Bz*. Если в В1 отсутствует только одна дуга контура Cn–1, то В1 не может быть максимальным, т.к., входя во множество {Bz}, он не совпадает с Bz*. Если в В1 отсутствуют две или более дуг контура, то каждая из этих дуг в В1 либо заменена дугой, заходящей в ту же вершину и имеющей меньший вес, либо вообще не заменена никакой дугой. В обоих случаях имеет место уменьшение веса ориентированного леса по сравнению с Bz*. То есть В1 не может быть максимальным лесом в G//. Таким образом A//n–1 - максимальный лес в графе G//.
Доказательство утверждения 2. Возможны два случая:
а) Ориентированный лес, определяемый букетом Аn, включает дугу (х,vn–1), т.е. дугу, заходящую в вершину vn–1.
б) Ориентированный лес, определяемый букетом Аn, не включает дуги, заходящей в вершину vn–1.
Случай «а». Лес Аn содержит дугу (х,vn–1), и, кроме того, в силу утверждения 1, B// совпадает с A//n–1, поэтому B// содержит некоторую дугу (х,у), соответствующую дуге (х,vn–1), где х Cn–1, y Cn–1. В - ориентированный лес в Gn–1, поэтому В/ не может содержать путь из некоторой вершины контура Cn–1 в вершину х. Причем среди лесов G/, не содержащих такого пути, В/ - максимальный. Каждая дуга графа G/ соответствует дуге графа Gn с таким же весом. Поскольку Аn содержит дугу (х,vn–1), то A/n–1 не должен содержать пути из контура Cn–1 в вершину х. Поэтому если вес леса A/n–1 меньше веса леса В/, то лес Аn в графе Gn не может быть максимальным. Значит, A/n–1 имеет тот же вес, что и В/.
Случай «б». Каждой дуге графа G/ соответствует дуга графа Gn с таким же весом. Более того, любой ориентированный лес в графе G/ соответствует ориентированному лесу в графе Gn с тем же весом. Поскольку в Аn нет дуги, заходящей в вершину vn–1, каждой дуге в Аn соответствует дуга в A/n–1. Следовательно, если A/n–1 не максимален в G/, то Аn не максимален в Gn. А это противоречит основному предположению.