Мирзаянов М.Р. Паросочетания и смежные задачи
Покажем, что выполняется следующий инвариант: после
-го выполнения строки 04
алгоритма 2 в
содержится максимальное паросочетание для графа
. Докажем это
утверждение по индукции. В самом деле, после первой итерации цикла в паросочетании
будет содержаться ребро, если и только если вершина
не изолированная.
Заметим, что TRY_KHUN(
) фактически пытается найти с помощью поиска в глубину
и, в случае успеха, заменяет
–
найденная цепь, и возвращает TRUE.
Рассмотрим
-ую итерацию цикла 02-04. В вызове TRY_KHUN(
) все рекурсивные
вызовы TRY_KHUN будут только от вершин
. Максимальное паросочетание
для графа
может быть больше, чем для графа
максимум на одно ребро. В этом
случае в
обязательно найдется ребро инцидентное
, но так как эта вершина не
насыщена паросочетанием
достаточно найти удлиняющую цепочку из вершины
).
Таким образом, в предположении, что инвариант верен на
-ой итерации, удалось
доказать, что инвариант сохраняется и на
-ой итерации. Значит, инвариант выполняется
на любой итерации, то есть в конце алгоритма, так как
суть максимальное
паросочетание.
Утверждение 2. Если в процессе алгоритма 2 вершина
насытилась некоторым
промежуточным паросочетанием, то
останется насыщенной до конца выполнения
алгоритма 2.
Утверждение 3. Если на
-ой итерации цикла 02-04 алгоритма 2 вершина
не
насытилась в ходе выполнения TRY_KHUN(
останется ненасыщенной до
конца выполнения алгоритма 2.
Сложность алгоритма 2 составляет, очевидно, величину
. Можно
попытаться оценить его сложность точнее. Предположим
, тогда цикл 02-04
выполнится
раз. Оценим время работы каждого вызова TRY_KHUN(
) строки 04.
Каждый вызов TRY_KHUN(
) (в том числе и рекурсивные вызовы) на первый взгляд
работают за
действий (разумеется, имеются в виду те вызовы, которые
проходят проверку в строке 01). На самом деле, каждая итерация цикла 04-07 либо
соответствует одному ребру из
, либо мгновенно успешно завершает вызов (если
13