ПОТОКИ В СЕТЯХ Определения Сеть - связный ориентированный граф G = (V, A) без петель и мультидуг, с 1 источником sV и 1 стоком tV. (Запретим одновременное дуг (i, j) и (j, i)) дуге графа (i, j) A, приписана пропускная способность bij ≥ 0, целое число, которое задает max доп. величину потока по дуге. Потоком из источника s в сток t (или st потоком) в сети G назовем мн. неотрицательных чисел xij, (i, j)A, для которых выполнены условия сохранения потока v, j s, xij x jk 0, j s, t , i:( i , j )A k :( j , k )A v, j t и ограничения на дуговые потоки 0 xij bij, (i, j) A Максимальный поток v x sj j:( s , j )A max ; x v, j s, xij x jk 0, j s, t , i:( i , j )A k :( j , k )A v, j t 0 xij bij, (i, j) A З. ЛП для ее решения применим аппарат ЛП. Более того, mat ограничений удовлетворяет свойству абсолютной унимодулярности… Известно неск. полиномиальных алг., трудоемкость кот. O(|V|3). Определения Пусть задан доп. поток из s в t. Назовем увеличивающим путем любой путь P из s в t в неориентированном графе, полученном из графа G игнорированием направлений дуг, кот. обладает след. свойствами: 1) дуги (i, j) E, проходимой путем P в прямом направлении (и называемой прямой дугой), xij < bij, т. е. прямые дуги пути не ненасыщенны; 2) дуги (j, i) E, проходимой путем P в обратном направлении i j (и называемой обратной дугой), xji > 0. st разрезом ( X , X ) наз. разбиение мн. вершин V на подмн. X и X Пропускная способность st разреза ( X , X ) равна C( X , X ) ( i , j )E:iX , jX bij st разрез является узким местом сети: v C ( X , X ), s X , t X Определения Увеличивающий путь: xij bij s i j xkj 0 k t Разрез и его пропускная способность: i xij bij j s t k xlk 0 l Теорема ФордаФалкерсона Наз. st разрез минимальным, если он имеет min проп. спос. среди всех st разрезов. Теорема (ФордаФалкерсона). В сети величина max st потока = пропускной способности min st разреза. Доказательство. Рассмотрим доп. поток {xij}. Если v = проп. спос. некоторого разреза, то теорема доказана. В прот. сл. величину потока можно по приводимому ниже правилу до тех пор, пока v не станет = проп. спос. нек. разреза. Имея поток {xij}, находим подмн. в. Х по след. правилам: 0. Поместим источник s в мн. X. 1. Если i X и xij < bij (дуга (i, j) не насыщена), то в. j X. 2. Если i X и xji > 0 ( > 0 поток по (j, i)), то в. j X. Доказательство теоремы ФордаФалкерсона Вершины Х поместим в мн. X Исп-я пр. 0 – 2 для построения Х, получим 1 из 2-х результатов: I. Сток t X . Тогда дуги (i, j) E, i X, j X согласно пр. 1 вып. условие xij = bij и, согласно пр. 2, имеет место равенство xji = 0 x ij iX , jX b ij iX , jX и x ji ( i , j )E:iX , jX 0 получен поток, величина кот. = C ( X , X ) II. Сток t X . Тогда из опр. мн. Х увеличивающий s-t путь s,…,i,i+1,…,t, в кот. все прямые дуги (i, i+1) не насыщены, и >0 поток по всем обратным дугам пути xi+1,i > 0. Доказательство теоремы ФордаФалкерсона Пусть 1 = min(bi,i+1 – xi,i+1) по всем прямым дугам (i, i+1) пути, 2 = minxi+1,i по всем обратным дугам (i+1, i), = min{1, 2} > 0. Проп. спос. bij целые числа. Начнем с целочисленного потока (например, 0). целое > 0 Можно увеличить на потоки по всем прямым дугам пути и уменьшить на потоки по всем обратным дугам пути. величина st потока увеличится на , и новые значения дуговых потоков останутся допустимыми. Используя новый поток, можно построить новое мн. Х. Если t попадет в Х, то можно снова увеличить поток и т. д. Т.к. проп. спос. min разреза ограничена, и на каж. шаге величина потока на 1, то после конечного числа шагов получим ситуацию I и max поток. Разрезы Следствие. Поток max не увеличивающего пути. В сети может несколько разл. max потоков и min разрезов. Теорема. Пусть ( X , X ) и (Y , Y ) – min st разрезы. Тогда ( X Y , X Y ) и ( X Y , X Y ) также min st разрезы. Теорема. Пусть ( X i , X i ) – min st разрезы, а ( X , X ) – разрез, полученный в доказательстве теоремы ФордаФалкерсона. Тогда X Xi i В алгоритме вершина может находиться в 1 из 3 состояний: не помечена, помечена, помечена и просмотрена. В начале все в. не помечены. Алгоритм расстановки пометок Форда-Фалкерсона Шаг 1. (Расстановка пометок). Метка в. j состоит из 2 частей: 1) либо индекса i+, если можно поток из i в j, либо индекса i, если можно поток из j в i; 2) числа (j), указывающего max величину, на кот. можно s-j поток, не нарушая ограничений на проп. спос. Ист. s приписывается метка [s+, (s)=+]. Теперь в. s помечена, а все остальные в. не помечены. Выберем помеч. но не просм. в. j. Она имеет метку [i+, (j)], или [i, (j)]. Каж. непом. в. k : xjk < bjk, припишем метку [j+, (k)], где (k)=min{(j), bjkxjk}. Такие в. k теперь помечены. Всем непом. в. k : xkj > 0, припишем метки [j, (k)], где (k)=min{(j), xkj}. Такие в. k теперь также помечены. Когда все смежные с j в. помеч., в. j – помеч. и просмотренная. Рассмотрим др. помеч., но не просм. в., пока t не окажется помеч. либо нельзя > пометить ни 1 в. и t остался непомечен. Алгоритм расстановки пометок Форда-Фалкерсона Если t не помеч., то не увеличивающего s-t пути, и текущий поток max. Если t помеч., то на шаге 2 поток по найденному увеличивающему пути увеличивается. Шаг 2. (Увеличение потока). Пусть t имеет метку [k+, (t)]. Тогда положим xkt=xkt+(t) и перейдем к в. k. Если k имеет метку [j+, (k)], то положим xjk=xjk+(t). Если k имеет метку [j, (k)], то положим xkj=xkj(t). Переходим к в. j. Продолжим движение по увеличивающему пути от стока к источнику, пока не придем в s. В результате величина потока увеличится на (t). Положим все вершины непомеченными и перейдем на шаг 1. Если нельзя пометить более ни 1 в. и сток остался непомеч., то ( X , X ) – min разрез, и полученный поток max Замечания Замечание. Если bijR, то алг. может не быть конечным или может сходиться не к max потоку. простые модификации алг. : Шаг 1. Удалить из сети все насыщенные дуги и перейти на шаг 2. Шаг 2. Найти увеличивающий путь и послать по нему max возможный поток. Перейти на шаг 1. Если такого пути нет, то перейти на шаг 3. Шаг 3. Восстановить все дуги сети. Найти увеличивающий путь и послать по нему max возможный поток. Перейти на шаг 1. Если увеличивающего пути нет, то алг. завершает работу. Трудоемкость алг. ФордаФалкерсона зависит от v и является псевдополиномиальной. методы, в которых среди увеличивающих путей находится путь min длины (по количеству входящих в него дуг), имеющие полиномиальную трудоемкость O(|V|3). Пример [2─,1] 1 1,1 проп. спос. 3,0 t [1+,1] 1,1 s [s+,] 2,1 2,2 2 [s+,1] поток Пример проп. спос. 1 1,1 3,1 1,0 s t [s+,] 2,1 2,1 2 [s+,1] поток [2+,1] Пример проп. спос. 1 1,1 3,1 1,1 s t [s+,] 2,2 2,2 2 поток Потоки минимальной стоимости Z c x ( i , j ) A ij ij min ; x v, j s, x x 0, j s, t , ij jk i:( i , j )A k :( j , k )A v, j t 0 xij bij, (i, j) A Если бы не было ограничений на проп. спос. дуг, то для решения задачи достаточно найти кратчайший (по cij) путь из s в t и пропустить по нему поток величины v. Приведем 2 алгоритма для случая целочисленных bij Алгоритм БасакераГоуэна Шаг 0. Положить все дуговые потоки и v = 0. Шаг 1. Определить модифицированные дуговые стоимости cij , 0 xij bij , * cij , xij bij , c , x 0. ji ji Шаг 2. Найти путь из s в t min длины и увеличить на 1 поток по этому пути. Если величина нового потока равна v, то алг. останавливается. В противном сл. перейти на шаг 1. Пример 3 1,1 s 1 1,1 v=2 1,2 1,2 2 1,1 2,2 2,2 4 t стоимость проп. спос. Шаг 0. Полагаем xij = 0. Шаг 1. Определяем модиф. стоимости cij* cij Шаг 2. Находим путь из s в t min длины, например, {s, 1, 2, t}. Полагаем xs1 = x12 = x2t =1. Перейдем на Шаг 1. Пример 3 1,0 s 1 1,1 1,1 2,0 Шаг 1. v=2 1,0 2 1,1 2,0 4 поток проп. спос. cs*1 c c2t* c1*s 1 * c21 2 ct*2 1 * 12 t Шаг 2. Находим путь {s, 3, 2, 1, 4, t} min длины 5. Пропустим 1 потока по этому пути: Пример 3 1,1 s 1,1 1 1,1 1,0 2,1 2 1,1 2,1 4 v=2 t поток проп. спос. Алгоритм Клейна Шаг 0. Найти произвольный доп. st поток величины v. Шаг 1. Определить модифицированные дуговые стоимости cij , 0 xij bij , * cij , xij bij , c , x 0. ji ji Шаг 2. Найти цикл <0 стоимости (назовем его отрицательным), где стоимость цикла равна сумме модиф. стоимостей входящих в него дуг. Увеличить поток по <0 циклу на =min{bij – xij, xji}, где min берется по всем прямым (i, j) и обрат. (j, i) дугам цикла, и перейти на шаг 2. Если <0 цикла нет, то найденный поток opt! (Если в сети несколько <0 циклов, то увеличить поток по каж. из них.) Корректность алгоритма Клейна Теорема. Поток величины v opt в сети с модиф. дуговыми стоимостями не отрицательных циклов. Доказательство. следует из того, что в случае < 0 цикла можно добавить циркуляцию по этому циклу, сохранив величину потока и уменьшив его стоимость, что противоречит opt потока. . Рассмотрим нек. поток, для кот. в сети не < 0 циклов. Предположим, что opt поток имеет < стоимость. Разложим opt поток на v путей, обозначим их oi, i = 1,…,v, по каж. из кот. пропущен 1-ый поток. Аналогично разложим рассматриваемый поток на v путей pi, i = 1,…,v, по каж. из кот. пропущен 1-ый поток. Ввиду того, что opt поток имеет < стоимость, пути oi и pi : стоимость потока по oi < стоимости потока по pi. Тогда эти пути: a) либо не имеют общих дуг, b) либо частично совпадают. Доказательство теоремы Случай a. Рассмотрим цикл из s в t по oi, затем из t в s по пути pi. Это отрицательный цикл (для модифицированных стоимостей). Получили противоречие. s oi t pi Случай b. Обозн. через f 1-ю в., после кот. пути oi и pi начинают различаться, а через l – 1-ю в., после кот. они совпадают. Стоимость потока по участку пути oi от f в l меньше стоимости по участку пути pi от f в l. найден <0 цикл: из f в l по пути oi, а из l в f по пути pi. Это противоречие доказывает теорему. s f oi pi l t Нахождение отрицательных циклов Для нахождения <0 циклов можно воспользоваться след. проц. ФлойдаУоршелла. Пусть dij – веса дуг (i, j)E. Рассмотрим след. тернарную (3-местную) операцию, определенную для нек. фикс. в. j: dik=min{dik, dij+djk}, i,k j (*) Если выполнить операцию (*) в. j, то в случае 0 весов получ. в результате зн. dik = длинам кратчайших путей из i в k пар вер. j i k Положим dii=+ и применим (*) j, i и k. Если в. i : dii < 0 она <0 циклу. Сам <0 цикл восстанавливается переходя из в. i в смежную в. j, у кот. djj < 0. Из в. j переходим в новую в. k с dkk < 0… пока не вернемся в в. i. T=O(n3). Пример 1 25,2 50,3 50,2 s 30,6 15,8 4 15,8 10,3 10,1 3 10,2 10,1 10,8 45,1 2 15,2 90,9 6 60,5 5 20,3 проп. спос. 80,4 7 10,3 10,1 9 20,2 8 стоимость 10,3 t Пример 1 25 40 30 15 20 4 15 s 6 10 5 15 2 15 3 5 65 7 20 10 10 10 10 t 10 10 9 20 8 20 v = 85 0 Пример i\j s 1 2 4 6 s -3 -6 1 3 2 4 6 2 1 9 -2 -2 -1 -9 1 40 s 20 5 2 3 3 6 20 5 -1 4 25 30 s 5 15 5 7 10 -5 810 -3 9 t 7 15 15 2 25 50 4 15 i\j 1 25 7 15 8 10 9 10 5 3 t 5 10 -2 4 3 -1 65 -4 3 -3 t 20