Алгоритм Гопкрофта-Карпа: различия между версиями
| [непроверенная версия] | [непроверенная версия] |
Daryin (обсуждение | вклад) |
Daryin (обсуждение | вклад) |
||
| Строка 5: | Строка 5: | ||
=== Математическое описание === | === Математическое описание === | ||
Граф <math>G = (V, E)</math> называется ''двудольным'', если его вершины можно разделить на две части <math>V = X \sqcup Y</math>, так что каждое ребро <math>e \in E</math> соединяет вершины из <math>X</math> и <math>Y</math>. Набор рёбер <math>M \subseteq E</math> называется ''паросочетанием'', если каждая вершина <math>v \in V</math> принадлежит не более чем одному ребру из <math>M</math>. Требуется найти '''максимальное паросочетание''' – паросочетание с максимально возможным числом рёбер. | |||
Вершина <math>v \in V</math> называется свободной, если она не принадлежит ни одному ребру из <math>M</math>. Простой путь | |||
:<math> | |||
P: e_1 = (v_1, v_2), e_2 = (v_2, v_3), \ldots, e_{2k-1} = (v_{2k-1}, v_{2k}) | |||
</math> | |||
называется ''увеличивающей цепью'', если его концы <math>v_1</math> и <math>v_{2k}</math> – свободные вершины, а каждое второе ребро принадлежит текущему паросочетанию: | |||
:<math> | |||
e_2, e_4, \ldots, e_{2k-2} \in M. | |||
</math> | |||
Паросочетание <math>M</math> является максимальным, если для него не существует увеличивающей цепи. | |||
Множество <math>M'</math>, полученное заменой в <math>M</math> рёбер <math>e_2, e_4, \ldots, e_{2k-2}</math> на рёбра <math>e_1, e_3, \ldots, e_{2k-1}</math>, является паросочетанием и содержит на одно ребро больше, чем <math>M</math>. Множество <math>M' = M \mathop{\Delta} P</math>, где <math>\mathop{\Delta}</math> обозначает операцию симметрической разности множеств. | |||
На каждом шаге алгоритма Гопкрофта-Карпа строится максимальное по включению множество кратчайших увеличивающих цепей <math>\{ P_1, \ldots, P_q \}</math>, не пересекающихся по вершинам, и текущее паросочетание <math>M</math> заменяется на <math>M = M \mathop{\Delta} P_1 \mathop{\Delta} P_2 \mathop{\Delta} \dots \mathop{\Delta} P_q</math>. Гарантируется, что число шагов не превышает <math>2 (\sqrt{\mu} + 1) = O(\sqrt{n})</math>, где <math>\mu</math> – число рёбер максимального паросочетания. | |||
Для поиска максимального множества кратчайших увеличивающих цепей применяется [[Поиск в ширину (BFS)|поиск в ширину]] с последующим [[Поиск в глубину (DFS)|поиском в глубину]]. | |||
=== Вычислительное ядро алгоритма === | === Вычислительное ядро алгоритма === | ||
=== Макроструктура алгоритма === | === Макроструктура алгоритма === | ||
Версия от 21:09, 24 июня 2015
Свойства и структура алгоритмов
Общее описание алгоритма
Алгоритм Гопкрофта-Карпа[1] предназначен для решения задачи о назначениях в случае единичных цен. По заданному двудольному графу алгоритм находит максимальное паросочетание за время [math]\displaystyle{ O(m \sqrt{n}) }[/math].
Математическое описание
Граф [math]\displaystyle{ G = (V, E) }[/math] называется двудольным, если его вершины можно разделить на две части [math]\displaystyle{ V = X \sqcup Y }[/math], так что каждое ребро [math]\displaystyle{ e \in E }[/math] соединяет вершины из [math]\displaystyle{ X }[/math] и [math]\displaystyle{ Y }[/math]. Набор рёбер [math]\displaystyle{ M \subseteq E }[/math] называется паросочетанием, если каждая вершина [math]\displaystyle{ v \in V }[/math] принадлежит не более чем одному ребру из [math]\displaystyle{ M }[/math]. Требуется найти максимальное паросочетание – паросочетание с максимально возможным числом рёбер.
Вершина [math]\displaystyle{ v \in V }[/math] называется свободной, если она не принадлежит ни одному ребру из [math]\displaystyle{ M }[/math]. Простой путь
- [math]\displaystyle{ P: e_1 = (v_1, v_2), e_2 = (v_2, v_3), \ldots, e_{2k-1} = (v_{2k-1}, v_{2k}) }[/math]
называется увеличивающей цепью, если его концы [math]\displaystyle{ v_1 }[/math] и [math]\displaystyle{ v_{2k} }[/math] – свободные вершины, а каждое второе ребро принадлежит текущему паросочетанию:
- [math]\displaystyle{ e_2, e_4, \ldots, e_{2k-2} \in M. }[/math]
Паросочетание [math]\displaystyle{ M }[/math] является максимальным, если для него не существует увеличивающей цепи.
Множество [math]\displaystyle{ M' }[/math], полученное заменой в [math]\displaystyle{ M }[/math] рёбер [math]\displaystyle{ e_2, e_4, \ldots, e_{2k-2} }[/math] на рёбра [math]\displaystyle{ e_1, e_3, \ldots, e_{2k-1} }[/math], является паросочетанием и содержит на одно ребро больше, чем [math]\displaystyle{ M }[/math]. Множество [math]\displaystyle{ M' = M \mathop{\Delta} P }[/math], где [math]\displaystyle{ \mathop{\Delta} }[/math] обозначает операцию симметрической разности множеств.
На каждом шаге алгоритма Гопкрофта-Карпа строится максимальное по включению множество кратчайших увеличивающих цепей [math]\displaystyle{ \{ P_1, \ldots, P_q \} }[/math], не пересекающихся по вершинам, и текущее паросочетание [math]\displaystyle{ M }[/math] заменяется на [math]\displaystyle{ M = M \mathop{\Delta} P_1 \mathop{\Delta} P_2 \mathop{\Delta} \dots \mathop{\Delta} P_q }[/math]. Гарантируется, что число шагов не превышает [math]\displaystyle{ 2 (\sqrt{\mu} + 1) = O(\sqrt{n}) }[/math], где [math]\displaystyle{ \mu }[/math] – число рёбер максимального паросочетания.
Для поиска максимального множества кратчайших увеличивающих цепей применяется поиск в ширину с последующим поиском в глубину.
Вычислительное ядро алгоритма
Макроструктура алгоритма
Описание схемы реализации последовательного алгоритма
Последовательная сложность алгоритма
Информационный граф
Описание ресурса параллелизма алгоритма
Описание входных и выходных данных
Свойства алгоритма
Программная реализация алгоритмов
Особенности реализации последовательного алгоритма
Описание локальности данных и вычислений
Возможные способы и особенности реализации параллельного алгоритма
Масштабируемость алгоритма и его реализации
Динамические характеристики и эффективность реализации алгоритма
Выводы для классов архитектур
Существующие реализации алгоритма
- Java: JGraphT (класс
HopcroftKarpBipartiteMatching).
Литература
- ↑ Hopcroft, John E, and Richard M Karp. “An $N^{5/2} $ Algorithm for Maximum Matchings in Bipartite Graphs.” SIAM Journal on Computing 2, no. 4 (1973): 225–31. doi:10.1137/0202019.