Как реализовать Форда-Фалкерсона в конкретной задаче?

Я работаю над конкретным упражнением, и я застрял.

Решать:

Решите проблему спроса на тираж. Есть несколько фабрик, которые производят товары, и несколько деревень, куда товары должны быть доставлены. Они связаны сетью дорог, каждая из которых имеет пропускную способность для максимального количества товаров, которые могут пройти по ней. Проблема состоит в том, чтобы найти, существует ли тираж, удовлетворяющий спрос. Эта задача может быть преобразована в задачу о максимальном потоке. Предположим, что каждый заводской узел fi имеет производительность pi. Кроме того, di — это уровень спроса деревни vi. Вашим вводом будет граф, заданный с использованием списка смежности для каждого его узла. Сначала укажите число, описывающее количество узлов графа, а затем одну строку для списка смежности каждого узла (вместе с пропускной способностью), например. «d a 10 c 5» означает, что узел d соединен с a (мощностью 10) и c (мощностью 5). Наконец, укажите уровень производства для каждого узла (где есть фабрики), а затем снова укажите уровень спроса для деревень на каждом узле.

Как я понял, мне нужен такой входной файл:

10
a b 10 c 20
b c 5 d 10
d e 7 f 8
a 10
e -5

//nodes = 10  
//directed graph -> a to b with capacity 10, a to c with capacity 20  
//a production = 10, e consumption = -5

Я пришел к выводу, что я должен использовать алгоритм Форда-Фалкерсона, чтобы найти максимальный поток (поскольку это то, что запрашивается в качестве вывода)

Просматривая различные реализации алгоритма (я рассматриваю возможность использования C или Java для его кодирования), я наткнулся на следующую проблему:

Ford-Fulkerson работает только с 1 источником и 1 приемником. В этой задаче у нас есть тестовые примеры, где есть, например, 3 фабрики и 2 деревни. Может кто-нибудь просветить меня, потому что я действительно застрял.


person Marios Louvaris    schedule 17.03.2019    source источник


Ответы (1)


Это типичное расширение алгоритма Форда-Фалкерсона с 1 источником и 1 приемником. По сути, вы считаете другой «воображаемый» узел U источником 1 и подключаете этот узел U ко всем фабрикам. (т.е. какие K источники в вашей проблеме)

Точно так же вы соединяете все M стоки, которые являются деревнями, с другим воображаемым узлом стока V, который вы добавляете к данному графу. Затем, когда вы вычислите максимальный поток от U до V, вы вычислите максимальный поток от всех фабрик во все деревни.

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

person ilim    schedule 17.03.2019
comment
Думаю, я понял концепцию. Большое спасибо за это. Однако, поскольку у каждой деревни есть определенный спрос, я не совсем понимаю ваш подход к подключению их всех к Раковине. (поскольку продемонстрировано, у нас есть отрицательное значение для каждой деревни прим. -5) - person Marios Louvaris; 17.03.2019
comment
Кроме того, есть ли у вас какие-либо идеи, могу ли я использовать другой алгоритм для конкретной проблемы? - person Marios Louvaris; 17.03.2019