Изменения

Перейти к: навигация, поиск
Алгоритм
==АлгоритмИдея алгоритма==Пусть дан двудольный граф <tex>G(V, E)</tex> и требуется найти [[Теорема о максимальном паросочетании и дополняющих цепях|максимальное паросочетание]] в нём. Преобразуем его в Обозначим доли исходного графа как <tex>L</tex> и <tex>R</tex>. Построим граф <tex>G'(V', E')</tex> следующим образом:
<tex>V' = V \cup \{s, t\}</tex>(т.е. добавим две новые вершины <tex>s</tex> и <tex>t</tex>)
Обозначим доли исходного графа как <tex>L</tex> и <tex>R</tex>. Тогда <tex>E' = \{(s,u): u \in L\} \cup \{(u, v): u \in L, v \in R\} \cup \{(v, t): v \in R\} </tex>(проведем ребра из <tex>s</tex> в каждую вершину <tex>L</tex>, и из каждой вершины <tex>R</tex> в <tex>t</tex>).
Изначально максимальное паросочетание пусто.# Будем искать в графе <tex>G'</tex> путь из <tex>s</tex> в <tex>t</tex> поиском в глубину.
# Если путь найден, инвертируем все рёбра на пути.
# Если путь не был найден, значит текущее паросочетание является максимальным, и алгоритм завершает работу. Иначе переходим к пункту 1.
В любой момент времени текущим паросочетанием будет множество рёбер, направленных из <tex>R</tex> в <tex>L</tex>.
 
 
Очевидно, что путь из <tex>s</tex> в <tex>t</tex> является дополняющей цепью для исходного графа <tex>G</tex>. Тогда корректность алгоритма следует из [[Теорема о максимальном паросочетании и дополняющих цепях|теоремы Бержа]].
==Псевдокод==
80
правок

Навигация