Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3720 / 176 | Оценка: 4.44 / 4.11 | Длительность: 13:45:00
Специальности: Программист, Математик
Лекция 12:

Паросочетания

Алгоритм 1. Построение дерева достижимости

  1. объявить все вершины новыми
  2. объявить вершину a четной
  3. a\Rightarrow Q
  4. создать дерево T из одной вершины a
  5. while Q\ne
\varnothing do
  6. x\Leftarrow Q
  7. if вершина x нечетная
  8. then if вершина x не свободная
  9. then y:=p(x)
  10. y\Rightarrow Q
  11. объявить вершину y четной
  12. добавить к дереву T вершину y и ребро (x,y)
  13. else for y\in V(x) do
  14. if вершина y новая
  15. then y\Rightarrow Q
  16. объявить вершину y нечетной
  17. добавить к T вершину y и ребро (x,y)

Если очередная рассматриваемая вершина x оказывается свободной (это выясняется при проверке в строке 8), нет необходимости доводить построение дерева до конца. В этом случае путь между вершинами a и x в дереве является увеличивающим путем и его можно использовать для построения большего паросочетания. После этого снова выбирается свободная вершина (если такая еще есть) и строится дерево достижимости. В приведенном тексте алгоритма соответствующий выход отсутствует, но его легко предусмотреть, добавив ветвь else к оператору if в строке 8.

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

Лемма 2. Если дерево достижимости содержит хотя бы одну вершину увеличивающего пути, то оно содержит увеличивающий путь.

Доказательство. Пусть дерево достижимости T с корнем a имеет общие вершины с увеличивающим путем P, соединяющим свободные вершины b и c. Покажем, что в T есть увеличивающий путь (это не обязательно путь P ). Достаточно доказать, что хотя бы одна из вершин b, c принадлежит дереву T. Если одна из них совпадает с вершиной a, то из теоремы 1 следует, что и другая принадлежит дереву, так что в этом случае в дереве имеется увеличивающий путь между вершинами b и c. Допустим, обе вершины b и c отличны от a. Пусть R - простой путь, начинающийся в вершине a, заканчивающийся в вершине x, принадлежащей пути P, и не содержащий других вершин пути P. Очевидно, что последнее ребро пути R слабое. Вершина x делит путь P на два отрезка - P_{b} и P_{c}, - содержащие соответственно вершины b и c. В одном из этих отрезков, скажем, в P_{b}, ребро, инцидентное вершине x, - сильное. Тогда объединение путей R и P_{b} образует чередующийся путь, соединяющий вершины a и b. По теореме 1, вершина b принадлежит дереву T.

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

Так как при поиске в ширину каждое ребро исследуется не более чем дважды, то общее время поиска увеличивающего пути для данного паросочетания есть O(m). Число ребер в паросочетании не может превышать n/2, поэтому общая сложность алгоритма будет O(mn).

Татьяна Наумович
Татьяна Наумович

Скажите, пожалуйста, можно ли еще получить документ о прохождении курса ("Графы и алгоритмы", декабрь 2020) после предоставления всех дополнительных необходимых документов?
Или нужно проходить заново?

Петр Петров
Петр Петров

произведение графов К(2)*О(4) фактически 4 отдельных графа К(2)?