Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3534 / 125 | Оценка: 4.44 / 4.11 | Длительность: 13:45:00
Специальности: Программист, Математик
Лекция 14:

Жадные алгоритмы и матроиды

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >

Взвешенные паросочетания

Рассмотрим следующую задачу. Дан двудольный граф G=(A,B,E) и для каждой вершины x\in A задан положительный вес w(x). Требуется найти такое паросочетание в этом графе, чтобы сумма весов вершин из доли A, инцидентных ребрам паросочетания, была максимальной. Эту задачу иногда интерпретируют следующим образом. A - это множество работ, а B - множество работников. Ребро в графе G соединяет вершину a\in A с вершиной b\in B, если квалификация работника b позволяет ему выполнить работу a. Каждая работа выполняется одним работником. Выполнение работы a принесет прибыль w(a). Требуется так распределить обязанности работников, чтобы максимизировать общую прибыль. Покажем, что эта задача может быть решена алгоритмом СПО в сочетании с методом чередующихся цепей.

Множество X\subseteq A назовем отображаемым, если в графе G существует паросочетание M, насыщающее все вершины из X. M в этом случае будем называть отображением для X. Пусть \Phi - семейство всех отображаемых множеств.

Теорема 3. Пара (A,\Phi) является матроидом.

Доказательство. Условие (1) определения матроида, очевидно, выполняется. Докажем, что выполняется и условие (2). Пусть X\in \Phi, Y\in \Phi, |X| < |Y|. Рассмотрим подграф H графа G, порожденный всеми вершинами из X\cup Y и всеми смежными с ними вершинами из доли B. Пусть M_{X} - отображение для X. Так как M_{X} не является наибольшим паросочетанием в графе H, то по теореме 6 относительно него в этом графе существует увеличивающая цепь. Одним из концов этой цепи является свободная относительно M_{X} вершина a\in
Y. После увеличения паросочетания M_{X} с использованием этой цепи, как было описано выше, получим паросочетание M', отображающее множество X\cup \{a\}. Следовательно, X\cup \{a\} \in
\Phi.

Даже если бы в задаче требовалось найти только отображаемое множество наибольшего веса, проверка принадлежности множества семейству \Phi требовала бы и нахождения соответствующего отображения, т.е. паросочетания. На самом же деле построение паросочетания входит в условие задачи. Комбинируя СПО с алгоритмом поиска увеличивающих цепей, получаем следующий алгоритм.

Алгоритм 2. Построение паросочетания наибольшего веса в двудольном графе G=(A,B,E) с заданными весами вершин доли A.

  1. Упорядочить элементы множества A по убыванию весов: A=\{a_{1},a_2,\ldots, a_{k}\}, w(a_{1} )\ge w(a_{2} )\ge \ldots \ge w(a_{k})
  2. X:=\varnothing
  3. M:=\varnothing
  4. for i:=1 to k do
  5. if в G существует увеличивающая цепь P относительно M, начинающаяся в вершине a_{i}
  6. then { X:=X\cup \{
a_{i}\} ; M:=M\otimes P}

Если для поиска увеличивающей цепи применить метод поиска в ширину, как описано выше, то время поиска будет пропорционально числу ребер. Общая трудоемкость алгоритма будет O(mk), где k - число ребер в доле A.

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Петр Петров
Петр Петров

произведение графов К(2)*О(4) фактически 4 отдельных графа К(2)?

Александр Лаврентьев
Александр Лаврентьев

много инструкций вида if - then - else

Например Procedure DFS(a) опишите каким образом следует понимать вложенность инструкций. Как в языке С ? 

т.е. следующее 

if (...) then (...)

if (...) then (...)

else(...)

 

раскрывается как 

if (...) then (...)

if (...) then (...)

         else(...)

или так :

if (...) then

 {  (...)

     if (...) then (...)

              else(...)

}

обьясните пожалуйста.

 

 

Ольга Чернышева
Ольга Чернышева
Россия
Ирина Алексеева
Ирина Алексеева
Россия, г. Обнинск