ringill's Journal
 
[Most Recent Entries] [Calendar View] [Friends View]

Tuesday, August 23rd, 2005

    Time Event
    11:36p
    Наибольшее паросочетание в двудольном графе
    [тут ничего нового]

    Паросочетание (matching) -- произвольное подмножество попарно несмежных ребер графа.
    Максимальное паросочетание (maximal matching) -- паросочетание, которое не содержится в паросочетании с большим числом ребер
    Наибольшее паросочетание (maximum matching) -- паросочетание, в котором число рёбер наибольшее среди всех паросочетаний графа.

    Двудольный (bipartite) граф -- такой граф, вершины которого (V) можно разделить на два множества (V+ и V-), так чтобы вершины каждого из множеств были попарно несмежны.

    Наибольшее паросочетание в любом графе можно найти за полиномиальное время (так написано в известной книге Гэри и Джонсона в комментарии к задаче ТГ 10).

    Ниже -- алгоритм нахождения наибольшего паросочетания в связном двудольном графе за O(mn), где |V|=n и |E|=m.
    Взято из статьи "Matching Algorithms for Bipartite Graphs" (ссылка).

    Определение
    Пусть есть паросочетание в графе (V, E), обозначим его M (множество рёбер). M-чередующийся путь -- это путь в графе, содержащий поочерёдно рёбра из M и из (E\M).
    Теорема
    Паросочетание M является наибольшим тогда и только тогда, когда нет невырожденного M-чередующегося пути, начинающегося и заканчивающегося в вершинах, не инцидентных ни одному ребру из М.
    Лемма
    Если такой путь есть (обозначим его рёбра как P), то можно получить разбиение большее, чем M, следующим образом: M' = M ^ P (симметрическая разность, или XOR).

    Алгоритм прост -- начать с пустого паросочетания M={} и постепенно увеличивать его, находя M-чередующийся путь из теоремы и выполняя операции, указанные в лемме. Когда путь найти будет нельзя, это будет означать, что M -- наибольшее паросочетание.

    Каждый шаг увеличивает M как минимум на одно ребро. Это значит, что всего шагов будет не больше чем n/2.

    Нахождение M-чередующегося пути осуществляется поиском в ширину (BFS). В качестве начальной вершины для поиска выбирается, например, свободная (не инцидентная ни одному ребру из M) вершина из V+. Если итерации BFS нумеровать с единицы, то на нечётных итерациях будем рассматривать только рёбра из (E\M), а на чётных -- только из M. Таким образом, если во фронте BFS окажется свободная вершина из V-, то получившийся путь к ней будет M-чередующимся путём со свободными началом и концом.
    Если BFS не обнаружит свободной вершины в V-, значит M-чередующегося пути нет, и текущее разбиение является наибольшим.
    При условии связности графа BFS займёт O(m) времени. А общее время работы = O(m*n).

    В статье приводится также модификация этого алгоритма, позволяющая снизить сложность до O(m * sqrt(n)). Суть модификации в том, чтобы при BFS не останавливаться на первой попавшейся свободной вершине из V-, а найти все и выбрать самую "далёкую", т.е. которая даст самый длинный путь.

    << Previous Day 2005/08/23
    [Calendar]
    Next Day >>

About LJ.Rossia.org