В задаче о максимальном потоке, как найти все возможные наборы путей, которые дают максимальный поток? - PullRequest
0 голосов
/ 18 декабря 2018

Я понимаю, что Алгоритм Форда-Фулкерсона может найти максимальный поток, который может течь от источника (s) к стоку (t) в сети потока.
Но есть лиалгоритм, который находит все возможные наборы путей, которые дают максимальный поток?

Пример:
В этой сети ниже все ребра имеют емкость 1. Нетрудно увидеть, что максимальный поток из *От 1009 * до t равно 3. Но как найти комбинации путей, несущих этот поток?

Ожидаемые выходы:
Набор путей 1: s-0-1-t, s-2-3-t, s-5-6-t
Набор путей 2: s-0-1-t, s-2-4-t, s-5-6-t
Набор путей 3: s-0-3-t, s-2-4-t, s-5-6-t
Набор путей 4: s-0-4-t, s-2-3-t, s-5-6-t

enter image description here

Аналогичный вопрос был задан здесь , но, похоже, не получил четкого ответа.

1 Ответ

0 голосов
/ 08 января 2019

Согласно вашему комментарию, я предполагаю, что все дуги направлены и имеют емкость 1.

Псевдокод высокого уровня равен

define EnumerateFlows(G, s, t):
    if G has no s-t path:
        yield []  # solution with no paths
    else:
        for P in EnumeratePaths(G, s, t):
            derive G' = G - P
            let s-u be the first arc in P
            derive G'' = G' - {arcs s-v such that v < u}  # ensure canonically ordered solutions only
            for F in EnumerateFlows(G'', s, t):
                yield [P, F...]  # solution with P followed by the elements of F

, где возвращаемое значение функции равносписок всех yield сделанных в его теле.Выходные данные требуют постобработки для удаления не максимальных потоков.

EnumeratePaths, несомненно, имеет решение по переполнению стека, но для полноты

define EnumeratePaths(G, s, t):
    if s = t:
        yield [s]
    else:
        for u in {successors of s in t}:
            for P in EnumeratePaths(G - {s-u}, u, t):
                yield [s, P...]

Чтобы улучшить EnumerateFlows, стоитдобавив проверку, чтобы убедиться, что в остаточном графе все еще существует максимальный поток.

Что касается рекомендаций по реализации низкого уровня, я бы предложил использовать представление списка смежности для G и соединить дуги ви из списков.С другой стороны, возможно, ваши графики настолько малы, что это не имеет значения.

...