Сопоставление в двудольном графе — это набор ребер, выбранных таким образом, что никакие два ребра не разделяют конечную точку. Максимальное соответствие — это соответствие максимального размера (максимальное количество ребер). При максимальном совпадении, если к нему добавлено какое-либо ребро, оно больше не совпадает. Для данного двудольного графа может быть более одного максимального соответствия.
Почему мы заботимся?
Есть много реальных проблем, которые могут быть сформированы как двустороннее сопоставление. Например, рассмотрим следующую проблему:
Есть М соискателей и N рабочих мест. Каждый соискатель имеет подмножество вакансий, в которых он / она заинтересован. Каждое вакансия может принять только одного соискателя, а соискатель может быть назначен только на одну работу. Найдите распределение заданий для заявителей таким образом, чтобы как можно большее количество заявителей получили работу.
Мы настоятельно рекомендуем сначала прочитать следующий пост.
Алгоритм Форда-Фулкерсона для задачи о максимальном расходе
Максимальное двустороннее согласование и проблема максимального расхода
Проблема M aximum B ipartite M atching ( MBP ) может быть решена путем преобразования ее в сеть потоков (см. Это видео, чтобы узнать, как мы пришли к такому выводу). Ниже приведены шаги.
1) Построить потоковую сеть
Должен быть источник и сток в сети потока. Таким образом, мы добавляем источник и добавляем ребра из источника всем заявителям. Аналогично, добавьте ребра из всех заданий в сток. Вместимость каждого края отмечена как 1 единица.
2) Найти максимальный расход.
Мы используем алгоритм Форда-Фулкерсона, чтобы найти максимальный поток в сети потоков, встроенной в шаге 1. На самом деле максимальный поток — это искомая MBP.
Как реализовать вышеуказанный подход?
Давайте сначала определим формы ввода и вывода. Ввод осуществляется в форме матрицы Эдмондса, которая представляет собой двумерный массив «bpGraph [M] [N]» с M строками (для M соискателей) и N столбцами (для N работ). Значение bpGraph [i] [j] равно 1, если i-й заявитель заинтересован в j-й работе, иначе 0.
Выход — это максимальное количество людей, которые могут получить работу.
Простой способ реализовать это — создать матрицу, которая представляет матричное представление смежности ориентированного графа с M + N + 2 вершинами. Вызовите fordFulkerson () для матрицы. Эта реализация требует O ((M + N) * (M + N)) дополнительного пространства.
Можно сократить дополнительное пространство и упростить код, используя тот факт, что граф является двудольным, а емкость каждого ребра равна 0 или 1. Идея состоит в том, чтобы использовать обход DFS для поиска работы для кандидата (аналогично увеличению пути в Ford-Фулкерсон). Мы вызываем bpm () для каждого кандидата, bpm () — это функция, основанная на DFS, которая пробует все возможности назначить работу кандидату.
В bpm () мы один за другим пробуем все вакансии, которые интересуют кандидата 'u', пока мы не найдем работу, или пока все работы не будут выполнены без удачи. Для каждой работы, которую мы пробуем, мы делаем следующее.
Если работа никому не назначена, мы просто назначаем ее заявителю и возвращаем true. Если задание назначено кому-то еще, скажем, x, то мы рекурсивно проверяем, можно ли назначить x другое задание. Чтобы удостовериться, что x не получит ту же самую работу снова, мы помечаем задачу 'v', как показано, прежде чем сделать рекурсивный вызов для x. Если x может получить другую работу, мы меняем претендента на работу 'v' и возвращаем true. Мы используем массив maxR [0..N-1], в котором хранятся кандидаты, назначенные на разные вакансии.
Если bmp () возвращает true, то это означает, что в сети потоков есть путь расширения и к результату в maxBPM () добавляется 1 единица потока.
|
Джава
|
питон
|
C #
|
PHP
|
Выход :
Maximum number of applicants that can get job is 5
Вы можете также увидеть ниже:
Алгоритм Хопкрофта – Карпа для максимального соответствия | Комплект 1 (Введение)
Алгоритм Хопкрофта – Карпа для максимального соответствия | Набор 2 (реализация)
Ссылки:
http://www.cs.cornell.edu/~wdtseng/icpc/notes/graph_part5.pdf
http://www.youtube.com/watch?v=NlQqmEXuiC8
http://en.wikipedia.org/wiki/Maximum_matching
http://www.stanford.edu/class/cs97si/08-network-flow-problems.pdf
http://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/07NetworkFlowII-2×2.pdf
http://www.ise.ncsu.edu/fangroup/or766.dir/or766_ch7.pdf
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Проверьте, является ли данный график двудольным или нет
- Алгоритм Форда-Фулкерсона для задачи о максимальном расходе
- Найти максимальное количество ребер непересекающихся путей между двумя вершинами
- Алгоритм Хопкрофта – Карпа для максимального соответствия | Комплект 1 (Введение)
- Алгоритм Хопкрофта – Карпа для максимального соответствия | Набор 2 (реализация)
- Максимальное количество ребер, которые можно добавить в DAG, чтобы они оставались DAG
- Алгоритм Диника для максимального потока
- Максимальное произведение двух непересекающихся путей в дереве
- Максимальное количество ребер, добавляемых к дереву, чтобы оно оставалось двудольным графом
- Проверьте, является ли данный граф двудольным, используя DFS
- Найдите корень поддерева, весовая сумма XOR которого с X максимальна
- Максимально возможный край непересекающегося остовного дерева из полного графика
- Максимальные и минимальные изолированные вершины в графе
- Максимальное количество ребер среди всех связанных компонент неориентированного графа
- Найти максимальную длину пути в двоичной матрице
0.00 (0%) 0 votes