Изменения

Перейти к: навигация, поиск

Совершенное паросочетание в кубическом графе

13 329 байт добавлено, 19:31, 4 сентября 2022
м
rollbackEdits.php mass rollback
==Лемма о сравнимости по модулю 2==
{{Лемма
|id = lemma1
|statement =
Пусть <tex>G</tex> {{---}} <tex>k</tex>-[[Основные определения теории графов#defRegularGraph |регулярный граф]], <tex>U \in V(G)</tex>, <tex>|U|</tex> нечётно, <tex>m</tex> {{---}} число рёбер, соединяющих вершины множества <tex>U</tex> с вершинами из <tex>V(G) \setminus U</tex>. Тогда <tex>m \equiv k \pmod 2</tex>
|proof =
[[Файл:Сравнимость.png|300px|thumb|left|Иллюстрация к лемме]]
<tex>m = (\sum\limits_{v \in U} d_G(v)) - 2e(G(U))</tex>, где <tex>e(G(U))</tex> {{---}} количество рёбер, соединяющих вершину из <tex>U</tex> с другой вершиной из <tex>U</tex>.
 
тогда <tex>m = k|U| - 2e(G(U))</tex>.
 
<tex>2e(G(U))</tex> чётно, поэтому <tex>m \equiv k|U| \pmod 2</tex>. Так как <tex> |U|</tex> нечётно, <tex>m \equiv k \pmod 2</tex>.
}}
 
==Теорема Петерсона (Petersen)==
{{Определение
|id=cube_graf_def
|definition= '''Кубический граф''' (англ. ''Cubic graph'') {{---}} [[Основные определения: граф, ребро, вершина, степень, петля, путь, цикл| граф]], в котором все вершины имеют степень три. Другими словами, кубический граф является <tex>3</tex>-регулярным.}}
 
{{Теорема
|id=th1.
|author=Петерсон
|statement=Кубический Пусть <tex>G</tex>{{---}}[[Отношение связности, компоненты связности#connected_graph | связный]] кубический граф, у которого в котором не более <tex>2</tex> [[Мост, эквивалентные определения | мостов]]. Тогда в <tex>G</tex> есть [[Паросочетания: основные определения, теорема о максимальном паросочетании и дополняющих цепях#perfect_matching | совершенное паросочетание]].|proof = Предположим, что совершенного паросочетания в <tex>G</tex> нет совершенного , тогда можно выбрать [[Теорема Татта о существовании полного паросочетания#Tutt_set | множество Татта]] <tex>S \subset V(G)</tex>.  Пусть <tex>U_1, \ldots, U_n</tex> {{---}} все нечётные компоненты связности графа <tex>G \setminus S</tex>. <tex>m_i</tex> {{---}} количество ребёр <tex>G</tex>, содержит связывающих вершины <tex>U_i</tex> с вершинами <tex>S</tex>.  По предыдущей лемме, все <tex>m_i</tex> нечётны. Так как минимум не более чем два ребра графа <tex>G</tex> {{---}} мосты, то не более, чем два числа из <tex>m_1, \ldots, m_n</tex> равны <tex>1</tex>, остальные числа не менее <tex>3</tex> моста.  Так как <tex>S</tex> {{---}} множество Татта, то <tex>odd(G \setminus S) > |S|</tex>. Так как количество вершин кубического графа <tex>G</tex> чётно, мы имеем <tex>S \neq \emptyset, odd(G \setminus S) \equiv S \pmod 2</tex>, следовательно, <tex>n = odd(G \setminus S) \geqslant |S| + 2</tex>. Тогда <tex>\sum\limits_{v \in S} d_G(v) \geqslant \sum\limits_{i = 1}^n m_i \geqslant 3n - 4 \geqslant 3(|S| + 2) - 4 = 3|S| + 2 > 3|S| = \sum\limits_{v \in S} d_G(v)</tex>, что, очевидно, невозможно.  Найдено противоречие, следовательно, множество Татта выбрать невозможно, следовательно, в <tex>G</tex> есть совершенное паросочетание.}}
==Следствие [[Файл:Петерсен 3 моста.png|300px|thumb|left|Кубический граф с тремя мостами, в котором не существует совершенного паросочетания.]]Заметим, что утверждение теоремы Петерсона==Для любого двусвязного кубического графа не может быть усилено до большего числа мостов, так как для случая с тремя мостами существует совершенное паросочетаниеконтрпример.
==Теорема Фринка (Frink)==
{{Теорема
|id=th2.
|statement=
Пусть <tex>G= (V, E)</tex> {{---}} двусвязный кубический граф. Возьмём ребро <tex>p = (c, d)</tex>. Пусть вершины <tex>a</tex> и <tex>b</tex> смежены смежны с вершиной <tex>c</tex>, а вершины <tex>e</tex> и <tex>f</tex> смежны с вершиной <tex>d</tex> (рисунок <tex>1 (a)</tex>). Как минимум одно из двух сокращений графа <tex>G</tex>, состоящее из удаления вершин <tex>c, d</tex> и пересоединения вершин <tex>a, b, e, f</tex> рёбрами <tex>(a, e), (b, f)</tex> или <tex>(a, f), (b, e)</tex> (рисунок <tex>1 (b), (c)</tex>, рисунок <tex>2</tex>) сохранит двусвязность графа.
|proof=
Обозначим компоненты графа <tex>G(V - \{c, d\})</tex> как <tex>A, B, E, F</tex>, которые содержат вершины <tex>a, b, e, f</tex> соответственно. Так как <tex>G</tex> не имеет мостов (соответственно <tex>p</tex> не является мостом) должно существовать ребро, соединяющее одну из компонент <tex>A</tex> или <tex>B</tex>, с одной из компонент <tex>E</tex> или <tex>F</tex>. Без потери общности предположим, что <tex>A</tex> соединено с <tex>E</tex>. Заметим, что рёбра <tex>(b, c), (d, f)</tex> так же не являются мостами, значит возможны три случая (с учётом изоморфизма) (рисунок <tex>3</tex>):* компонента <tex>B</tex> соединена с <tex>F</tex>,* компонента <tex>B</tex> соединена с <tex>E</tex> и компонента <tex>E</tex> соединена с <tex>F</tex>,* компонента <tex>A</tex> соединена с <tex>B</tex> и компонента <tex>E</tex> соединена с <tex>F</tex>.Во всех трёх случаях если <tex>G(V - \{c, d\})</tex> расширить рёбрами <tex>(a, f), (b, e)</tex> (получим граф <tex>G'</tex>), добавленные рёбра будут лежать на некотором [[Основные определения: граф, ребро, вершина, степень, петля, путь, цикл| цикле ]] в <tex>G'</tex> (рисунок <tex>4</tex>). Так же, для любой пары вершин <tex>u, v</tex> <math>\in</math> <tex>\{a, b, e, f\}</tex> существует цикл в <tex>G'</tex>, содержащий данные вершины. Чтобы доказать, что <tex>G'</tex> двусвязен, нужно показать, что каждое ребро <tex>r</tex> из <tex>G'</tex> лежит на некотором цикле в <tex>G'</tex>. Пусть цикл <tex>C</tex> в <tex>G</tex> содержит <tex>r</tex> (такой цикл существует, так как <tex>G</tex> двусвязен). Если <tex>C</tex> не проходит через вершины <tex>c, d</tex> тогда <tex>C</tex> так же является циклом в <tex>G'</tex>, иначе построим цикл <tex>C'</tex> графа <tex>G'</tex> из <tex>C</tex> следующим образом:
* если путь <tex> x - c - d - y </tex> <math>\in</math> <tex> C </tex>, <tex> x </tex> <math>\in</math> <tex> \{a, b\} </tex>, <tex> y </tex> <math>\in</math> <tex> \{e, f\} </tex>, удалим этот путь и добавим любой другой из <tex> x </tex> в <tex> y </tex> в <tex> G' </tex>, не содержащий <tex>r</tex> (такой путь всегда существует, так как <tex> x </tex> и <tex> y </tex> принадлежат некоторому циклу в <tex> G' </tex>),
* если путь <tex> a - c - b </tex> <math>\in</math> <tex> C </tex>, удалим этот путь и добавим любой другой из <tex> a </tex> в <tex> b </tex> в <tex> G' </tex>, не содержащий <tex>r</tex>,
*если путь <tex> e - d - f </tex> <math>\in</math> <tex> C </tex>, удалим этот путь и добавим любой другой из <tex> e </tex> в <tex> f </tex> в <tex> G' </tex>, не содержащий <tex>r</tex>.
<tex>C'</tex> это набор циклов (так как <tex>C'</tex> получен из <tex>C</tex> путём преобразования некоторых путей) и содержит <tex>r</tex>. Из этого следует, что каждое ребро графа <tex>G'</tex> лежит на некотором цикле, то есть граф не содержит мостов. Значит <tex>G'</tex> двусвязен.
}}
 
{|align="center"
|-valign="center"
|[[Файл:Frinks_algorithm1.png|thumb|500px|Рисунок 1. Сокращение двусвязного кубического графа. <tex>(a)</tex> Нужно удалить вершины <tex>c, d</tex>. <tex>(b)</tex> первый тип сокращения {{---}} вершина <tex>a</tex> соединена с <tex>e</tex>, вершина <tex>b</tex> соединена с <tex>f</tex>. <tex>(c)</tex> второй тип сокращений {{---}} вершина <tex>a</tex> соединена с <tex>f</tex>, вершина <tex>b</tex> соединена с <tex>e</tex>.]]
|[[Файл:Frinks_algorithm2.PNG|thumb|500px|Рисунок 2. Особые случаи сокращения графа. <tex>(a)</tex> ребро <tex>(c, d)</tex>, которое нужно удалить, кратное. Сокращение удаляет вершины <tex>c, d</tex> из графа и соединяет <tex>a</tex> и <tex>e</tex> новым ребром. <tex>(b)</tex> ребро <tex>(c, d)</tex> инцидентно двум двойным рёбрам <tex>(a, c)</tex> и <tex>(d, e)</tex>. Сокращение удаляет вершины <tex>c, d</tex> и добавляет новое кратное ребро <tex>(a, e)</tex>. <tex>(c)</tex> Ребро <tex>(c, d)</tex> инцидентно одному ребру <tex>(d, e)</tex>. Сокращение удаляет вершины <tex>c, d</tex> и добавляет два новых ребра <tex>(a, e)</tex> и <tex>(b, e)</tex>. <tex>(d)</tex> Ребро <tex>(c, d)</tex> тройной кратности. Сокращение удаляет вершины <tex>c, d</tex>. ]]
|}
 
{|align="center"
|-valign="center"
|[[Файл:Frinks_algorithm3.PNG|thumb|500px|Рисунок 3. Все возможные соединения двусвязных компонент графа <tex>G[V - \{c,d\}]</tex>. <tex>(a)</tex> Компонента <tex>A</tex> соединена с компонентой <tex>E</tex>, компонента <tex>B</tex> соединена с компонентой <tex>F</tex>. <tex>(b)</tex> Компонента <tex>E</tex> соединена с компонентами <tex>A, B, F</tex>. <tex>(c)</tex> Компонента <tex>A</tex> соединена с компонентами <tex>B, E</tex>, компонента <tex>E</tex> соединена с компонентой <tex>F</tex>. ]]
|[[Файл:Frinks_algorithm4.PNG|thumb|500px|Рисунок 4. Возможные соединения двусвязный компонент <tex>A, B, E, F</tex> после удаления ребра <tex>(c, d)</tex> и добавления рёбер <tex>(a, f)</tex> и <tex>(b, e)</tex>.]]
|}
 
==Алгоритм поиска совершенного паросочетания (Frink's algorithm)==
Будем сокращать данный граф <tex>G</tex> вышеизложенным способом (на каждой итерации можем выбирать любое ребро) пока не удалим все вершины.
Когда все вершины закончились, создадим пустое совершенное паросочетание <tex>M</tex> и начнём обратный процесс для всех сокращений, то есть будем восстанавливать граф (начиная с последних удалённых вершин). Каждый такой шаг будет приводить к одному из четырёх базовых случаев, представленных в рисунке <tex>5</tex> или к одному из специальных случаев из рисунка <tex>6</tex>. Восстановление для всех специальных случаев, а так же для первых трёх базовых выполняется по строгому алгоритму, т.е. разрешимо за <tex>O(1)</tex>. Единственный проблемный случай, когда оба ребра принадлежат совершенному паросочетанию. В этой ситуации необходимо найти альтернативный цикл, содержащий как минимум одно из этих рёбер и обновить паросочетание с этим циклом. Эти действия сводят четвёртый базовый случай к одному из первых трёх.
{|align="center"
|-valign="center"
|[[Файл:Frinks_algorithm5.PNG|thumb|400px|Рисунок 5. Базовые случаи восстановления графа.]]
|[[Файл:Frinks_algorithm6.PNG|thumb|400px|Рисунок 6. Особые случаи восстановления графа.]]
|}
==Псевдокод алгоритма Фринка==
*<tex>G</tex> {{---}} двусвязный кубический граф,
*<tex>M</tex> {{---}} совершенное паросочетание <tex>G</tex>,
*функция <tex>\mathtt{bridgeless}</tex> возвращает <tex>true</tex> если у графа нет моста или <tex>false</tex> в противном случае,
*функция <tex>\mathtt{alternatingCycle}</tex> принимает три параметра: граф, совершенное паросочетание и ребро. Возвращает альтернативный цикл, включающий в себя данное ребро и обновляет совершенное паросочетание,
*функция <tex>\mathtt{reductions}</tex> сокращает граф,
*функция <tex>\mathtt{simpleReversion}</tex> восстанавливает граф,
*функция <tex>\mathtt{reductedGraph}</tex> принимает три параметра: граф, удаляемые вершины, добавляемые рёбра. Возвращает новый граф, у которого удалены выбранные вершины, вместе c инцидентными рёбрами и добавлены другие рёбра, переданные в параметрах. При этом исходный граф не меняется.
'''function''' frinkMatching<tex>(G)</tex>: '''if''' <tex>|V| = 0</tex> '''return''' <tex>\varnothing</tex> <tex>v - w = E[0]</tex> <tex>R = </tex> reductions<tex>(G, v - w)</tex> '''if''' bridgeless<tex>(</tex>reductedGraph<tex>(G, \{v, w\}, R[0]))</tex> <tex>r = R[0]</tex> '''else''' <tex>r = R[1]</tex> <tex>M =</tex> frinkMatching<tex>(</tex>reductedGraph<tex>(G,\{v, w\}, r))</tex> '''if''' <tex>|r \cap M| = 2 </tex> <tex>C =</tex> alternatingCycle<tex>(G, M, r[0])</tex> <tex>M = M \oplus C</tex> <tex>M = (M - r)\ \cup </tex> simpleReversion<tex>(G, v, w, r, M)</tex> '''return''' <tex>M</tex>
[[Файл:Frinks_algorithm1==Время работы алгоритма Фринка==Операция сокращения должна на каждом шаге проверять граф на наличие мостов за <tex>O(n)</tex>, кроме того, при возникновении четвёртого базового случая требуется найти альтернативный цикл за <tex>O(n)</tex>.png|thumb|right|300x300px|Рисунок 1В алгоритме <tex>O(n)</tex> операций сокращения и восстановления графа, причем каждая из этих операций требует <tex>O(n)</tex> времени. Таким образом, весь этот алгоритм исполняется за время <tex>O(n^2)</tex>.]]
==См. также==
* [[Использование обхода в глубину для поиска цикла]]
* [[Использование обхода в глубину для поиска мостов]]
* [[Паросочетания: основные определения, теорема о максимальном паросочетании и дополняющих цепях]]
== Источники информации ==
* [https://www.lektorium.tv/course/22771 Лекториум {{---}} Дополнительные главы теории паросочетаний]
* [https://ru.wikipedia.org/wiki/%D0%9A%D1%83%D0%B1%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D1%84 Wikipedia {{---}} Кубический граф]
* Piotr Stanczyk {{---}} THEORY AND PRACTICE OF COMPUTING MAXIMUM MATCHINGS IN GRAPHS стр. 21-28.
* Карпов В. Д. - Теория графов, стр 42
==Алгоритм поиска совершенного паросочетания за <tex>O(n^2)</tex> (Frink's algorithm)==[[Категория: Алгоритмы и структуры данных]]Главная идея алгоритма заключается в предыдущей теореме.[[Категория: Задача о паросочетании]]
1632
правки

Навигация