Мережевий потік являє собою орієнтований граф G = (V, E)
з вихідної вершиною s ϵ V
і вершиною раковини t ϵ V
, і де кожне ребро (u, v) ϵ E
на графіку (вузли підключення u ϵ V
і v ϵ V
) мають 2 величин , пов'язані з цим:
c(u, v) >= 0
, ємність краюa(u, v) >= 0
, вартість відправки однієї одиниці через край
Ми визначаємо функцію 0 <= f(u, v) <= c(u, v)
- кількість одиниць, що проходять через заданий край (u, v)
. Таким чином, вартість для даного краю (u, v)
є a(u, v) * f(u, v)
. Проблема потоку мінімальної вартості визначається як мінімізація загальної вартості по всіх ребрах для заданої кількості потоку d
, задана наступною кількістю:
Наступні обмеження стосуються проблеми:
- Вимоги до ємності : потік через даний край не може перевищувати ємність цього краю (
f(u, v) <= c(u, v)
). - Симетрія нахилу : потік, хоча даний край повинен бути антисиметричним, коли напрямок повернено (
f(u, v) = -f(v, u)
). - Збереження потоку : чистий потік у будь-який невідтоковий вузол повинен бути 0 (для кожного
u ∉ {s, t}
, підсумовуючи по всіхw
,sum f(u, w) = 0
). - Необхідний потік : чистий потік із джерела та чистий потік у мийку повинні одночасно дорівнювати необхідному потоку через мережу (підсумовуючи по всьому
u
,sum f(s, u) = sum f(u, t) = d
).
Враховуючи потокову мережу G
та необхідний потік d
, виведіть мінімальну вартість для відправки d
одиниць через мережу. Ви можете припустити, що рішення існує. d
і вся ємність і витрати будуть невід’ємними цілими числами. Для мережі з N
вершинами, позначеними [0, N-1]
вершиною, буде вихідною вершиною, 0
а вершиною раковини буде N-1
.
Це є код-гольф, тому найкоротша відповідь (у байтах) виграє. Пам'ятайте, що це змагання як між мовами, так і між мовами, тому не бійтеся розміщувати рішення на багатослівній мові.
Вбудовані дозволені, але вам рекомендується включати рішення без вбудованих програм, або як додаткове рішення в тій самій відповіді, або як незалежна відповідь.
Вхід може бути будь-яким розумним способом, що включає потужність та витрати кожного краю та попит.
Випробування
Тестові приклади надаються у такому форматі:
c=<2D matrix of capacities> a=<2D matrix of costs> d=<demand> -> <solution>
c=[[0, 3, 2, 3, 2], [3, 0, 5, 3, 3], [2, 5, 0, 4, 5], [3, 3, 4, 0, 4], [2, 3, 5, 4, 0]] a=[[0, 1, 1, 2, 1], [1, 0, 1, 2, 3], [1, 1, 0, 2, 2], [2, 2, 2, 0, 3], [1, 3, 2, 3, 0]] d=7 -> 20
c=[[0, 1, 1, 5, 4], [1, 0, 2, 4, 2], [1, 2, 0, 1, 1], [5, 4, 1, 0, 3], [4, 2, 1, 3, 0]] a=[[0, 1, 1, 2, 2], [1, 0, 2, 4, 1], [1, 2, 0, 1, 1], [2, 4, 1, 0, 3], [2, 1, 1, 3, 0]] d=7 -> 17
c=[[0, 1, 4, 5, 4, 2, 3], [1, 0, 5, 4, 3, 3, 5], [4, 5, 0, 1, 5, 5, 5], [5, 4, 1, 0, 3, 2, 5], [4, 3, 5, 3, 0, 4, 4], [2, 3, 5, 2, 4, 0, 2], [3, 5, 5, 5, 4, 2, 0]] a=[[0, 1, 4, 2, 4, 1, 1], [1, 0, 3, 2, 2, 1, 1], [4, 3, 0, 1, 4, 5, 2], [2, 2, 1, 0, 2, 2, 3], [4, 2, 4, 2, 0, 4, 1], [1, 1, 5, 2, 4, 0, 2], [1, 1, 2, 3, 1, 2, 0]] d=10 -> 31
c=[[0, 16, 14, 10, 14, 11, 10, 4, 3, 16], [16, 0, 18, 19, 1, 6, 10, 19, 5, 4], [14, 18, 0, 2, 15, 9, 3, 14, 20, 13], [10, 19, 2, 0, 2, 10, 12, 17, 19, 22], [14, 1, 15, 2, 0, 11, 23, 25, 10, 19], [11, 6, 9, 10, 11, 0, 14, 16, 25, 4], [10, 10, 3, 12, 23, 14, 0, 11, 7, 8], [4, 19, 14, 17, 25, 16, 11, 0, 14, 5], [3, 5, 20, 19, 10, 25, 7, 14, 0, 22], [16, 4, 13, 22, 19, 4, 8, 5, 22, 0]] a=[[0, 12, 4, 2, 9, 1, 1, 3, 1, 6], [12, 0, 12, 16, 1, 2, 9, 13, 2, 3], [4, 12, 0, 2, 2, 2, 2, 10, 1, 1], [2, 16, 2, 0, 2, 1, 8, 4, 4, 2], [9, 1, 2, 2, 0, 5, 6, 23, 5, 8], [1, 2, 2, 1, 5, 0, 13, 12, 12, 1], [1, 9, 2, 8, 6, 13, 0, 9, 4, 4], [3, 13, 10, 4, 23, 12, 9, 0, 13, 1], [1, 2, 1, 4, 5, 12, 4, 13, 0, 13], [6, 3, 1, 2, 8, 1, 4, 1, 13, 0]] d=50 -> 213
Ці тестові випадки були обчислені з бібліотекою NetworkX Python .