Алгоритм вырезания соцветий — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Оценка сложности)
Строка 35: Строка 35:
 
== Оценка сложности ==
 
== Оценка сложности ==
  
Всего имеется <tex>V</tex> итераций, на каждой из которых выполняется обход в ширину за <tex>O(E)</tex>, кроме того, могут происходить операции сжатия цветков — их может быть <tex>O(V)</tex>. Если уметь сжимать соцветие за <tex>O(V)</tex>, то общая асимптотика алгоритма составит <tex>O(V(E + V^2)) = O(V^3)</tex>.
+
Всего имеется <tex>V</tex> итераций, на каждой из которых выполняется обход в ширину за <tex>O(E)</tex>, кроме того, могут происходить операции сжатия цветков — их может быть <tex>O(V)</tex>. Сжатие соцветий работает за <tex>O(V)</tex>, то есть общая асимптотика алгоритма составит <tex>O(V(E + V^2)) = O(V^3)</tex>.
  
 
==Литература==
 
==Литература==

Версия 10:16, 29 февраля 2012

Паросочетание в недвудольном графе

Рассмотрим неориентированный невзвешенныйграф [math] G =\langle V, E \rangle [/math], где [math]V [/math] — множество вершин, [math]E [/math] — множество ребер. Требуется найти в нем максимальное паросочетание.

Приведем пример, на котором алгоритм Куна работать не будет. Рассмотрим граф [math]G[/math] с множеством вершин [math]V={1,2,3,4} [/math], и множеством ребер —[math]E={\langle 1,2 \rangle, \langle 2, 3 \rangle, \langle 3, 1 \rangle, \langle 2, 4 \rangle}[/math] и пусть ребро [math]\langle 2, 3\rangle[/math] взято в паросочетание. Тогда при запуске из вершины [math]1[/math], если обход пойдёт сначала в вершину [math]2[/math], то он зайдет в тупик в вершине [math]3[/math], вместо того чтобы найти увеличивающую цепь [math]1-3-2-4[/math]. Как видно на этом примере, основная проблема заключается в том, что при попадании в цикл нечётной длины, обход может пойти по циклу в неправильном направлении.

Теорема Эдмондса

Теорема:
Пусть даны граф [math]G[/math], паросочетание [math]M[/math] в [math]G[/math] и цикл [math]Z[/math] длины [math]2k+1[/math], содержащий [math]k[/math] ребер паросочетания [math]M[/math] и вершинно непересекающийся с остальными ребрами из [math]M[/math]. Построим новый граф [math]G'[/math] из графа [math]G[/math], сжимая цикл [math]Z[/math] до единичной вершины, при этом все ребра, инцидентные вершинам этого цикла, становятся инцидентными вершине в новом графе. Тогда паросочетание [math]M -E(Z)[/math], где [math]E(z)[/math] — ребра, инцидентные циклу, является наибольшим в [math]G'[/math] тогда и только тогда, когда М — наибольшее паросочетание в [math]G[/math]
Доказательство:
[math]\triangleright[/math]

Предположим, что [math]M[/math] не является наибольшим паросочетанием в [math]G[/math], тогда в силу теоремы о максимальном паросочетании и дополняющих цепях существует увеличивающая относительно [math]M[/math] цепь [math]P[/math]. Если [math]P[/math] не пересекается с [math]Z[/math], то цепь является увеличивающей относительно [math]M'[/math] и в графе [math]G'[/math], а значит, [math] М'[/math] не может быть наибольшим паросочетанием. Поэтому предположим, что цепь [math]P[/math] пересекается с [math]Z[/math]. Заметим, что хотя бы одна концевая вершина цепи [math]P[/math] не лежит на [math]Z[/math], обозначим ее через [math]u[/math]. Тогда пройдем по цепи [math]P[/math], начиная с [math]u[/math] до первой встречной вершины на [math]Z[/math], обозначим ее через [math]v[/math]. Тогда, при сжатие цикла [math]Z[/math], участок [math]P[u,v][/math] отобразится на увеличивающую цепь относительно [math]M'[/math], то есть [math]М'[/math] не является максимальным паросочетанием, что противоречит нашему предположению.

Теперь допустим, что [math]M'[/math] не является наибольшим паросочетанием в графе [math]G'[/math]. Обозначим через [math]N'[/math] паросочетание в [math]G'[/math], мощности большей, чем [math]M'[/math]. Восстановим граф [math]G[/math], тогда [math]N'[/math] будет соответствовать некоторому паросочетанию в [math]G[/math], покрывающему не более одной вершины в [math]Z[/math]. Следовательно паросочетание [math]N'[/math] можно увеличить, используя [math]k[/math] ребер цикла [math]Z[/math], и получить паросочетание [math]N[/math], размера [math]|N| = |N'|+k \gt |M'|+k = |M|[/math], то есть [math]М[/math] не является наибольшим паросочетанием в [math]G[/math], приходим к противоречию. Таким образом теорема доказана.
[math]\triangleleft[/math]

Для простоты описания алгоритма введем некоторые определения.

Определение:
Будем называть соцветием [math]B[/math] графа [math]G[/math] его цикл нечетной длины.

Cжатием соцветия назовем граф [math]G'[/math], полученный из [math]G[/math] сжатием всего нечётного цикла в одну псевдо-вершину. Все рёбра, инцидентные вершинам этого цикла, становятся инцидентными псевдо-вершине в новом графе.

База соцветия - вершина соцветия, в которую входит ребро не из данного соцветия.


Рис. 1 Рис. 2

Алгоритм вырезания соцветий

Опишем алгоритм, позволяющий находить максимальное паросочетание для произвольного графа [math]G[/math]. Из теоремы Эдмондса понятно, что необходимо рассматривать паросочетание в сжатом графе, где его можно найти, к примеру, при помощи обхода в ширину, а после восстанавливать паросочетание в исходном графе.

Основную сложность представляют операции сжатия и восстановления цветков. Чтобы эффективно это делать, для каждой вершины необходимо хранить указатель на базу цветка, которому она принадлежит, или на себя в противном случае. Предположим, что для поиска паросочетаний в сжатом графе, мы используем обход в ширину. Тогда на каждой итерации алгоритма будет строиться дерево обхода в ширину, причём путь в нём до любой вершины будет являться чередующимся путём, начинающимся с корня этого дерева. Будем класть в очередь только те вершины, расстояние от корня до которых в дереве путей четно. Также для каждой вершины, расстояние до которой нечетно, в массиве предков [math]p[][/math] необходимо хранить ее предка — четную вершину. Заметим, что если в процессе обхода в ширину мы из текущей вершины [math]v[/math] приходим в такую вершину [math]u[/math], являющуюся корнем или принадлежащую паросочетанию и дереву путей, то обе эти вершины принадлежат некоторому цветку. Действительно, при выполнении этих условий эти вершины являются чётными вершинами, следовательно расстояние от них до их наименьшего общего предка имеет одну чётность. Найдем наименьшего общего предка [math]lca(u,v)[/math] вершин [math]u[/math], [math]v[/math], который является базой цветка. Для нахождения самого цикла необходимо пройтись от вершин [math]u[/math], [math]v[/math] до базы цветка. В явном виде цветок сжимать не будем, просто положим в очередь обхода в ширину все вершины, принадлежащие цветку. Также для всех четных вершин (за исключением базы) назначим предком соседнюю вершину в цикле, а для вершин [math]u[/math] и [math]v[/math] назначим предками друг друга. Это позволит корректно восстановить цветок, в случае, когда при восстановление увеличивающего пути, мы зайдем в нечетную вершину цикла.

Оценка сложности

Всего имеется [math]V[/math] итераций, на каждой из которых выполняется обход в ширину за [math]O(E)[/math], кроме того, могут происходить операции сжатия цветков — их может быть [math]O(V)[/math]. Сжатие соцветий работает за [math]O(V)[/math], то есть общая асимптотика алгоритма составит [math]O(V(E + V^2)) = O(V^3)[/math].

Литература