Поиск циркуляции в сети с нижними границами

Я не могу понять, как найти циркуляционный поток в сети с нижними границами (не требованиями). Я нашел следующие документы с описанием проблемы и стратегиями решения:

  1. https://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/flowext.pdf
  2. http://homes.cs.washington.edu/~anderson/iucee/Slides_421_06/Lecture24_25_26.pdf
  3. http://web.engr.illinois.edu/~jeffe/teaching/algorithms/2009/notes/18-maxflowext.pdf

Рассмотрим сеть со следующими ребрами (l - нижняя граница, c - пропускная способность):

1 -> 2 : l = 1 c = 3

2 -> 3 : l = 2 c = 4

3 -> 1 : l = 1 c = 2

Насколько я понимаю, для решения проблемы мы должны сделать следующие шаги:

  1. преобразовать эту проблему в "проблему обращения с требованиями". Это можно сделать с помощью следующей формулы dv' = dv - (Lin - Lout), где 'dv' - исходный спрос на вершину (в нашем случае он равен нулю), 'Lin' - сумма нижних границ входных ребер вершины, а ' Lout' - сумма нижних границ выходных ребер вершины.
  2. обновить емкости ребер как c' = c - l
  3. добавить исходную вершину S с ребрами к каждой вершине с dv ‹ 0 с мощностями '-dv'
  4. добавить вершину стока T с ребрами из каждой вершины с dv > 0 с мощностями 'dv'
  5. найти max-flow в новой сети любым из алгоритмов, например алгоритмом Эдмондса-Карпа.
  6. если величина максимального потока равна сумме всех запросов на вершины с выходами на Т, то в сети есть циркуляция.

После выполнения этих действий новая сеть будет:

S -> 2 : c = 1

2 -> 3 : c = 2

3 -> T : c = 1

1 -> 2 : c = 2

3 -> 1 : c = 1

Требования к вершинам:

d1 = 0

d2 = -1

d3 = 1

Мы видим, что максимальный поток равен 1 и равен сумме ребер до T, которая также равна 1. И он покрывает ребра A->2->3->T.

Вопрос в том, как получить циркуляционный поток в исходной сети с исходными границами?

Циркуляционный поток в исходной сети существует — нам нужно просто присвоить всем ребрам поток, равный 2.


person KolKir    schedule 22.11.2016    source источник
comment
Удалось ли вам в итоге найти решение? Я только начал третью неделю, похоже, многие люди заканчивают на этой неделе :)   -  person Pavel    schedule 31.07.2017


Ответы (1)


Немного поздно, но я наткнулся на этот вопрос, работая над решением этой проблемы.

Если вы сделаете это по-другому, то есть:

  1. Шаги 1 и 2, как в вашем вопросе.
  2. Добавьте вершину S с ребрами к каждой вершине с dv > 0 с мощностями 'dv'
  3. Добавьте вершину T с ребрами из каждой вершины с dv ‹ 0 с мощностями '-dv'

После этого решение, найденное любым алгоритмом максимального потока, будет:

  • S->3 : c=1
  • 3->1 : c=1
  • 1->2 : c=1
  • 2->T : c=1

В виде изображения

Теперь вам нужно просто добавить значения нижних границ к результату предыдущих шагов. В таком случае:

  • 1->2 : c=1, l=1, c+l = 2
  • 2->3 : c=0, l=2, c+l = 2
  • 3->1 : c=1, l=1, c+l = 2

И у вас есть ответ, который вы искали. Я надеюсь, что это поможет кому-то.

person RegyN    schedule 08.05.2018