Скажите, пожалуйста, можно ли еще получить документ о прохождении курса ("Графы и алгоритмы", декабрь 2020) после предоставления всех дополнительных необходимых документов? |
Паросочетания
Выявление цветков не представляет трудности - нужно только добавить
ветвь else к оператору if в строке 14 алгоритма 1. Первое, что
мы сделаем, обнаружив цветок, - превратим все сильные ребра
пути
в слабые, а слабые - в сильные. После этого преобразования множество
сильных ребер является паросочетанием той же мощности, но вместо
вершины
свободной вершиной станет вершина
. Таким образом, на
цикле
будет одна свободная вершина и этот цикл
является чередующимся путем, который начинается и заканчивается в этой
вершине. Покажем, что такой цикл можно стянуть в одну вершину, не теряя
информации о существовании увеличивающих путей.
Операция стягивания подграфа в графе
состоит
в следующем. Все вершины этого подграфа удаляются из графа, а вместо них
добавляется новая вершина. Эта новая вершина соединяется ребрами с теми
и только теми из оставшихся вершин графа, которые были смежны хотя бы
с одной вершиной подграфа
. Граф, получаемый в результате такой
операции, будем обозначать через
.
Теорема 3. Пусть - паросочетание в графе
,
- цикл длины
в этом графе, причем на
цикле имеется
сильных ребер и одна свободная вершина.
Пусть
- паросочетание в графе
,
составленное
из всех ребер паросочетания
, не принадлежащих
циклу
. Паросочетание
является наибольшим
в графе
тогда и только тогда, когда
-
наибольшее паросочетание в графе
.
Доказательство. Докажем, что из существования увеличивающего пути относительно
паросочетания в графе
следует, что существует
увеличивающий путь относительно паросочетания
в графе
и обратно.
Пусть - свободная вершина цикла
. Новую
вершину,
образованную в графе
при стягивании цикла
,
обозначим через
. Отметим, что она является свободной вершиной
относительно паросочетания
.
Пусть - увеличивающий путь в графе
.
Если он не
содержит вершин цикла
, то он будет увеличивающим путем и в графе
. В противном случае рассмотрим отрезок
пути
,
начинающийся в свободной вершине, отличной от
, заканчивающийся
в вершине
, лежащей на цикле
, и не содержащий
других
вершин цикла
. Если в пути
заменить вершину
вершиной
, то, очевидно, получится увеличивающий путь
в графе
.
Обратно, пусть - увеличивающий путь в
графе
.
Если
не проходит через вершину
, то он будет
увеличивающим путем
и в графе
. В противном случае рассмотрим путь
,
получающийся удалением вершины
из пути
.
Можно считать,
что вершина
была последней вершиной пути
, а
путь
заканчивается в предпоследней вершине
. Так как
вершина
смежна с вершиной
в графе
, то в
графе
на цикле
имеется вершина
, смежная
с
. Добавим
к пути
тот из отрезков цикла
, соединяющих
вершину
с вершиной
, который начинается сильным ребром.
В результате получится увеличивающий путь в графе
.
Из доказательства видно, что увеличивающий путь в графе при
известном увеличивающем пути в графе
находится за линейное
время. Для получения оценок времени работы алгоритма в целом требуется еще
проработка ряда деталей, например подробностей выполнения операции
стягивания и т.д. Однако ясно, что это время ограничено полиномом.