Максимальное двудольное соответствие (ford-fulkerson)

Я читал http://www.geeksforgeeks.org/maximum-bipartite-matching/ и http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm, и у меня возникли проблемы с пониманием. Кажется, что пример основан на предположениях, что каждая работа может принимать только 1 человека, и каждый человек хочет 1 работу. Мне было интересно, как изменится алгоритм/код, если, например, набор v имеет емкость > 1 (можно нанять нескольких человек для этой работы), а u set > 1 (каждый человек хочет более 1 задания)?

Ответ 1

Чтобы задания могли иметь более одного человека, назначенного им, вы должны изменять только размер границ от Jobs до Terminal (подобно тому, как Niklas B. описал в его комментарий, но не совсем.)

Вот так:

Flow network

Емкость 1 от Source до People и 1 от People до Jobs гарантирует, что человек будет выбран только для одного задания (поскольку максимальный поток, который они могут вносить в целом 1). Однако емкости > 1 от Jobs до Terminal позволяют назначить более одного человека для этой работы.

Если человек может выполнять более 1 задания, то максимальный поток от Source до Person увеличивается на эту величину:

Another flow network

Где i, j, k и x являются stand-ins для целых чисел со значениями >= 1

Ключевая вещь, которую следует помнить здесь, состоит в том, что пропускная способность слева от People диктует, сколько заданий они могут предпринять, а пропускные способности справа от Jobs определяют, сколько людей может быть назначено этой задаче. Емкости в середине не должны меняться.