Задача о наибольшем паросочетании в двудольном графе
Download
1 / 22

Задача о наибольшем паросочетании в двудольном графе - PowerPoint PPT Presentation


  • 262 Views
  • Uploaded on

Задача о наибольшем паросочетании в двудольном графе. Автор : Воробьева Елена [email protected] 2002 год.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Задача о наибольшем паросочетании в двудольном графе' - evita


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Задача о наибольшем паросочетании в двудольном графе

Автор: Воробьева Елена

[email protected]

2002 год


Граф паросочетании в двудольном графеG=(M,N) называется простым или двудольным, если множество его вершин разбито на два множества Mе и Mb, и все начала дуг принадлежат Mb, а все концы Mе, т.е. M = MeMb, MeMb=, eN: e=(i,k), iMb, kMe c неповторяющимися i и k.


Набор дуг паросочетании в двудольном графеJNназывается паросочетанием, если для любых j1,j2J, j1j2, начала и концы этих дуг различны: beg j1beg j2, end j1end j2.

Рассмотрим далее построение паросочетания, максимального по числу входящих дуг.


Построение наибольшего паросочетания с помощью максимального потока в сети.

Мы будем использовать метод Форда-Фалкерсона для поиска максимального паросочетания в двудольном графе G=(M,N). Для этого рассмотрим сеть G' = (M’,N'), соответствующую двудольному графу G.

Эта сеть строится так: добавляются две новые вершины, которые будут истоком (s) и стоком (t): M’ = M  {s, t}. Множество (направленных) рёбер сети G' таково:

N' = {(s,u): uMb} {(u,v): uMb, vMe, (u,v)N}  {(v,t): vMe}

(напомним, что через Mb и Me обозначаются доли графа). Будем считать, что пропускная способность каждого ребра равна единице.


  • Алгоритм построения паросочетания с паросочетания:

  • соединяем sдугами с  i Mb

  • соединяем t дугами с  j Me

  • направление на ребрах устанавливаем отi к j

  • 4.  ( i, j ): Cij= 1

  • 5. методом Форда-Фалкерсона ищем максимальный поток. Насыщенные ребра потока соответствуют наибольшему паросочетинию исходного графа.

  • Рассмотрим пример:


Сеть паросочетания с G’и максимальный поток в ней.

Пропускная способность любого ребра равна 1. Поток по фиолетовым ребрам равен единице, по остальным – нулю.

Построив максимальный поток через эту сеть, насыщенные ребра будут соответствовать наибольшему паросоче- танию в графе.


Следующая лемма устанавливает соответствие между потоками в G’ и паросочетаниями в G.

Поток f в сетиGназывается целочисленным, если все значения f(u,v) = целые.

Метод Форда-Фалкерсона всегда дает целочисленный максимальный поток, если только пропускная способность всех ребер целые числа (на каждом шаге, при каждом добавлении потока по дополняющему пути, поток остается целочисленным ).

Лемма.

Пусть G = (M,N) – двудольный граф с долями Mbи Me, и G`=(M`,N`) – соответствующая сеть. Пусть J – паросочетание в G. Тогда существуетцелочисленный поток в G` с величиной |f| = |J|. Обратно, если существует целочисленный поток в G’, то в G найдется паросочетание с |f| рёбрами.

Доказательство.

Сначала докажем, что паросочетание порождает поток, задав поток f следующим образом. Если(u,v)J, то

f(s,u) = f(u,v) = f(v,t) = 1

f(u,s) = f(u,v) = f(t,v) = -1


Для всех остальных рёбер устанавливает соответствие между потоками в (u,v)N` положим f(u,v) = 0. Иначе говоря, каждое ребро (u,v) Jсоответствует единичному потоку по пути suvt. Никакие два таких пути не содержат общих вершин (кроме истока и стока) или рёбер.

Чтобы проверить, что f является потоком, достаточно заметить, что f представим в виде суммы потоков по этим путям. Поток через разрез (Mb{s} = S, Me{t} = T) равен |J|

|J|=f(S,T)=f(S,M’)–f(S,S) = f(S,M’)=f(s,M’) + f(S\s,M’)= f(s,M’) = |f|

поэтому величина потока |f| равна |J|.

Докажем обратное.

Пусть f –целочисленный поток в G’; его значения на рёбрах могут быть равны 0 или 1, так как пропускная способность рёбер ограничена единицей. Определим

J = {(u, v) : uMb, v Me, f(u, v) = 1}

Докажем, что J– паросочетание. В самом деле, из одной вершины u не могут выходить два ребра (u,v’) и (u,v’’), по которым поток равен 1, т.к. входящий в uпоток не превосходит 1. По аналогичным причинам в любую вершину vвходит не более одного ребра с единичным потоком.


Убедимся, что устанавливает соответствие между потоками в |J| = |f|. Заметим, что |J| есть поток через разрез (Mb{s}, Me{t}) (по каждому ребру паросочетания идёт поток 1, а число рёбер есть |J|).

Таким образом лемма сводит задачу о максимальном паросочетании к задаче о целочисленном максимальном потоке.


Построение наибольшего паросочетания методом чередующихся цепей.

Рассмотрим еще один вариант постановки этой задачи. Обозначим существующие ребра матрицей A, где строки соответствуют Me, а столбцы Mb:

Введем неизвестную величину:

Помимо (1) величина xij удовлетворяет еще двум условиям:


Чтобы было как можно большее паросочетание, надо максимизировать функционал:

Запись задачи состоит из оптимизируемого линейного функционала и нескольких условий (называемых ограничениями), которые линейны, как (2) или (3). Такая задача называется задачей линейного программирования.


Для решения задачи о наибольшем паросочетании применяется метод чередующихся (или удлиняющихся) цепей. Пусть J - паросочетание в двудольном графе G. Цепь, в которую поочередно входят ребра из Jи не из J назовем чередующейся (удлиняющейся) относительно J.

По определению, цепь, состоящая из одного ребра, тоже чередующаяся. Вершины, инцидентные ребрам из J назовем насыщенными, а прочие - ненасыщенными. Очевидно, что если в графе существует чередующаяся относительно J цепь с ненасыщенными концевыми вершинами, то в ней ребер, не принадлежащих паросочетанию, на одно больше, чем принадлежащих.

Если цепь «перекрасить», т. е. сделать все жирные ребра тонкими, а тонкие - жирными, то число жирных ребер, а, следовательно, и паросочетание, увеличатся на одно ребро. Чередующаяся относительно J цепь с ненасыщенными концевыми вершинами называется увеличивающей относительно J цепью.


Теорема 1 наибольшем паросочетании применяется .

Паросочетание J является наибольшим тогда и только тогда, когда нет увеличивающих относительно J цепей.

Доказательство.

Необходимость очевидна, а достаточность докажем от противного. Пусть увеличивающихся относительно J цепей нет, а большее, чем J, паросочетание Jо есть.

Рассмотрим граф Н, состоящий из ребер, входящих или в J, или в Jо, но не в оба вместе. Вообще, Н — необязательно связный, и в нем ребер из Jо больше, чем ребер из J. Любая вершина H инцидентна самое большее одному ребру из J и одному из Jо.

Связная компонента из Н может быть:

1. циклом;

2.цепью, у которой одно концевое ребро из J, а второе из Jо;

3. цепью, у которой оба концевых ребра из J;

4. цепью, у которой оба концевых ребра принадлежат Jо.


Цикл в двудольном графе, очевидно, имеет четное число ребер, значит, в случае (1) число ребер из J равно числу ребер из Jо. То же соотношение верно для случая (2), а в случае (3) ребер из J больше, чем ребер из Jо. Но в графе Н ребер из Jо больше, чем из J, поэтому обязательно должен быть случай (4). Но цепь в этом случае является увеличивающей относительно J, что даст противоречие, доказывающее теорему.

Теорема1 служит основой для алгоритма нахождения наибольшего паросочетания.Но прежде, чем описывать этот алгоритм, мы выделим вспомогательный алгоритмперечисления всех вершин ориентированного графа, достижимых из данной вершины.

В алгоритмеданная вершина-s, результат (в виде номера предыдущей вершины на пути достижения) записывается в массиве Р из n чисел, где n- количество вершин графа; еще используются рабочие массив boolean R (из n элементов) и очередь обрабатываемых элементов Q.


  • Алгоритм 1: очевидно, имеет четное число ребер, значит, в случае (1) число ребер из

  • Перечисление вершин орграфа, достижимых из s

  • (инициализация): prev:= s, для i = 1,…,n все R[i]:=false,

  • P[i] := -1.

  • 2. (общий шаг):

  • 2.1. в цикле рассмотрим все вершины k в орграфе, непосредственно следующие за prev. Если для вершины k R[k] = false, то enqueue(Q,k); P[k] := prev; R[k] := true.

  • 2.2. Если Q != , то prev = dequeue (Q); перейти к 2.1.

  • 3. (завершение): выдача Р, конец.


Рассмотрим пример: очевидно, имеет четное число ребер, значит, в случае (1) число ребер из

(дан ориентированный граф, найти все вершины, достижимые из s=1)

шаг 1 : все P и R равны -1 и false; prev := 1; Q := 

шаг 2.1 : Q = {2}

P = (-1, 1,-1, …)

R = (f, t, f,…)

шаг 2.2 : Q = {} prev = 2;

шаг 2.1 : Q ={3, 4}

P = (-1, 1, 2, 2, -1, -1, -1)

R = (f, t, t, t, f,…)

(вершины 3 и 4 включены в рабочую зону Q, в P отмечено, чтоони достижимы из 2, в R мы отмечаем, что их уже посетили )


шаг 2 очевидно, имеет четное число ребер, значит, в случае (1) число ребер из .2: Q = {4} prev = 3

шаг 2.1: Q = {4}

P = (-1,1,2,2,-1,-1,-1)

R – не изменился, т.к. после рассмотрения вершины 3 множество достижимых вершин не изменилось

шаг 2.2: Q = {5} prev = 4

шаг 2 : Q = {5}

P = (-1,1,2,2,4,-1,-1)

R[5] = true (мы достигли 5-ой вершины)

шаг 2 : Q = {}

P = (-1,1,2,2,4,-1,-1)

новых достижимых вершин нет

шаг 3 : завершение

Массив Р можно «раскрутить» и узнать, по какому пути (кратчайшему по числу шагов) достижима каждая вершина. Скажем, массив Р показывает, что вершина 5 достижима из 4, 4 из 2, 2из 1, т.е. существует путь [1,2,4,5].


Теперь вернемся к описанию алгоритма нахождения наибольшего паросочетания.

Пусть I={1,2,...,m} - номера верхних вершин, а K={1,2,...,n} -- номера нижних. Вначале все вершины ненасыщенные. Для построения начального паросочетания применим «жадный» алгоритм; будем просматривать по очереди вершины из I, если из iI ведут ребра в ненасыщенные вершины изK будем жадно хватать и вводить в паросочетание первое попавшееся ребро, не думая о последствиях.

Далее, преобразуем двудольный граф В в ориентированный граф В’, введя ориентацию следующим образом:

все ребра, вошедшие в J, ориентируем снизу вверх, т.е. из Kв I, а остальные ребра сверху вниз, т.е. из I в K.

Пусть I = I+ I-, K= K+K-, где минус означает подмножество ненасыщенных ребер, а плюс — насыщенных. Очевидно, что увеличивающая относительно паросочетания J цепь существует в графе В тогда и только тогда, когда в графе B’существует путь из sвt, где sI-, t  K-.


  • Алгоритм 2 алгоритма нахождения наибольшего паросочетания:

  • построение наибольшего паросочетания

  • (инициализация):

  • 1.1. Построение начального J (производится описанным выше «жадным» алгоритмом).

  • 1.2. Построение ориентированного графа В (описано выше).

  • 2. (общий шаг):

  • 2.1. В цикле по i  I- применить алгоритм 1 нахождения всех вершин В, достижимых из вершины I-. Если среди достижимых вершин окажется вершина koK-,то (i,...,kо) есть увеличивающая относительно J цепь в графе B. Увеличить J и перейти к 1.2.

  • 3. (завершение): выдача J, конец.


Посмотрим на примере построение паросочетания. Рассмотрим граф, приведенный ниже на рисунке.

Для построение начального парсочетания будет применять жадный алгоритм, а затем введем ориентацию.


На рисунке построение паросочетания. Рассмотрим граф, приведенный ниже на рисунке.I-={4}. Из вершины 4 в графе В’ достижимы вершины 1', 2, 3, 4' и 4'. Вершина 4‘K-. Строится путь [4, 3', 3, 1', 2, 4']. В соответствующей увеличивающей цепи в графе В меняется цвет ребер. Полученное наибольшее паросочетание показано наследующем рисунке.


Список используемой литературы: построение паросочетания. Рассмотрим граф, приведенный ниже на рисунке.

1. И.В.Романовский “Дискретный анализ”

2. Т.Кормен, Ч.Лейзерсон, Р.Ривест “Алгоритмы построение и анализ”

3. В.М.Бондарев, В.И.Рублинецкий, Е.Г.Качко “Основы программирования”


ad