Изменения
→Алгоритм вырезания соцветий
== Паросочетание в недвудольном графе==
Рассмотрим неориентированный невзвешенный [[Основные определения теории графов|граф]] <tex> G =\langle V, E \rangle </tex>, где <tex>V </tex> {{Определение---}} множество [[Основные определения теории графов| вершин]], <tex>E </tex> {{---}} множество [[Основные определения теории графов|рёбер]]. Требуется найти в нём максимальное паросочетание. Приведём пример, на котором [[Алгоритм Куна для поиска максимального паросочетания|definition= Соцветие алгоритм Куна]] работать не будет. Рассмотрим граф <tex>BG</tex> графа с множеством вершин <tex>GV=(V{1,2,3,E)4} </tex> , и множеством рёбер {{- цикл, состоящий из --}}<tex>2k + E={\langle 1,2 \rangle, \langle 2, 3 \rangle, \langle 3, 1 \rangle, \langle 2, 4 \rangle}</tex> ребери пусть ребро <tex>\langle 2, 3\rangle</tex> взято в паросочетание. Тогда при запуске из которых только вершины <tex>k1</tex> входят , если обход пойдёт сначала в соцветие вершину <tex>B2</tex>.}}{{Определение|definition= Cжатие соцветия - граф , то он зайдёт в тупик в вершине <tex>G'3</tex>, полученный из вместо того чтобы найти увеличивающую цепь <tex>G1-3-2-4</tex> сжатием соцветия . Как видно на этом примере, основная проблема заключается в том, что при попадании в цикл нечётной длины, обход может пойти по циклу в одну псевдо-вершинунеправильном направлении.}}
== Теорема Эдмондса ==
{{Теорема
|statement=
Пусть даны граф <tex>G</tex>, паросочетание <tex>M</tex> в графе <tex>G</tex> существует соцветие и цикл <tex>Z</tex> длины <tex>2k+1</tex>, содержащий <tex>k</tex> рёбер паросочетания <tex>M</tex> и вершинно непересекающийся с остальными рёбрами из <tex>BM</tex>.Построим новый граф <tex>G'<br /tex> из графа <tex>G</tex>, сжимая цикл <tex>Z</tex>до единичной вершины, при этом все ребра, инцидентные вершинам этого цикла, становятся инцидентными вершине в новом графе. Тогда паросочетание <tex>M -E(Z)</tex>, где <tex>E(z)</tex> {{---}} ребра, инцидентные циклу, является наибольшим в <tex>G'</tex> существует удлиняющий путь тогда и только тогда, когда существует удлиняющий путь М {{---}} наибольшее паросочетание в <tex>G\setminus B</tex>
|proof=
Основную сложность представляют операции сжатия и восстановления цветков. Чтобы эффективно это делать, для каждой вершины необходимо хранить указатель на базу цветка, которому она принадлежит, или на себя в противном случае. Предположим, что для поиска паросочетаний в сжатом графе, мы используем обход в ширину. Тогда на каждой итерации алгоритма будет строиться дерево обхода в ширину, причём путь в нём до любой вершины будет являться чередующимся путём, начинающимся с корня этого дерева. Будем класть в очередь только те вершины, расстояние от корня до которых в дереве путей чётно. Также для каждой вершины, расстояние до которой нечётно, в массиве предков <tex>\Leftarrowp[]</tex>необходимо хранить её предка {{---}} чётную вершину. Заметим, что если в процессе обхода в ширину мы из текущей вершины <tex>v</tex> приходим в такую вершину <tex>u</tex>, что она является корнем или принадлежит паросочетанию и дереву путей, то обе эти вершины принадлежат некоторому цветку. Действительно, при выполнении этих условий эти вершины являются чётными вершинами, следовательно расстояние от них до их наименьшего общего предка имеет одну чётность. Найдём наименьшего общего предка <tex>lca(u,v)</tex> вершин <tex>u</tex>, <tex>v</tex>, который является базой цветка. Для нахождения самого цикла необходимо пройтись от вершин <tex>u</tex>, <tex>v</tex> до базы цветка. В явном виде цветок сжимать не будем, просто положим в очередь обхода в ширину все вершины, принадлежащие цветку. Также для всех чётных вершин (за исключением базы) назначим предком соседнюю вершину в цикле, а для вершин <tex>u</tex> и <tex>v</tex> назначим предками друг друга. Это позволит корректно восстановить цветок в случае, когда при восстановлении увеличивающего пути мы зайдем в нечётную вершину цикла.