Совершенное паросочетание в кубическом графе — различия между версиями
Profick (обсуждение | вклад) |
Profick (обсуждение | вклад) |
||
Строка 52: | Строка 52: | ||
|[[Файл:Frinks_algorithm6.PNG|thumb|400px|Рисунок 6.]] | |[[Файл:Frinks_algorithm6.PNG|thumb|400px|Рисунок 6.]] | ||
|} | |} | ||
+ | |||
+ | ==Реализация== | ||
+ | * <tex>G</tex> двусвязный кубический граф, | ||
+ | * <tex>M</tex> совершенное паросочетание <tex>G</tex>. | ||
+ | |||
+ | '''if''' <tex>|V| = 0</tex> '''then''' | ||
+ | '''return''' <tex>\varnothing</tex> | ||
+ | '''else''' | ||
+ | <tex>v - w = E[0]</tex> | ||
+ | <tex>R = reductions(G, v - w)</tex> | ||
+ | '''if''' <tex> bridgeless(G[V − {v, w}, E \cup R[0]])</tex> '''then''' | ||
+ | <tex>r = R[0]</tex> | ||
+ | '''else''' | ||
+ | <tex>r = R[1]</tex> | ||
+ | '''end if''' | ||
+ | <tex>M \leftarrow frink\_matching(G[V - \{v, w\}, E \cup r])</tex> |
Версия 18:01, 28 января 2016
Теорема (Петерсон): |
Кубический граф, у которого нет совершенного паросочетания, содержит как минимум моста. |
Следствие теоремы Петерсона
Для любого двусвязного кубического графа существует совершенное паросочетание.
Теорема (Фринк): |
Пусть — двусвязный кубический граф.
Возьмём ребро Как минимум одно из двух сокращений графа . Пусть вершины и смежены с вершиной , а вершины и смежны с вершиной (рисунок ). , состоящее из удаления вершин и пересоединения вершин рёбрами или (рисунок ) сохранит двусвязность графа. |
Доказательство: |
Обозначим компоненты графа как , которые содержат вершины соответственно. Так как не имеет мостов (соответственно не является мостом) должно существовать ребро, соединяющее одну из компонент или , с одной из компонент или . Без потери общности предположим, что соединено с . Заметим, что рёбра так же не являются мостами, значит возможны три случая (с учётом изоморфизма) (рисунок ):
Во всех трёх случаях если расширить рёбрами (получим граф ), добавленные рёбра будут лежать на некотором цикле в (рисунок ). Так же, для любой пары вершин существует цикл в , содержащий данные вершины. Чтобы доказать, что двусвязен, нужно показать, что каждое ребро из лежит на некотором цикле в . Пусть цикл в содержит (такой цикл существует, так как двусвязен). Если не проходит через вершины тогда так же является циклом в , иначе построим цикл графа из следующим образом:
|
Алгоритм поиска совершенного паросочетания за O(n^2) (Frink's algorithm)
- будем сокращать данный граф вышеизложенным способом (на каждой итерации можем выбирать любое ребро) пока не удалим все вершины,
- когда все вершины закончились, создадим пустое совершенное паросочетание и начнём обратный процесс для всех сокращений (начиная с последних удалённых вершин). Каждый такой шаг будет приводить к одному из четырёх базовых случаев, представленных в рисунке или к одному из специальных случаев из рисунка . Обратный процесс для всех специальных случаев, а так же для первых трёх базовых выполняется по строгому алгоритму, т.е. разрешим за . Единственный проблемный случай, когда оба ребра принадлежат совершенному паросочетанию. В этой ситуации необходимо найти альтернативный цикл, содержащий как минимум одно из этих рёбер и обновить паросочетание с этим циклом. Эти действия сводят четвёртый базовый случай к одному из первых трёх.
Реализация
- двусвязный кубический граф,
- совершенное паросочетание .
ifthen return else if then else end if