все записи автора
Пусть задан неориентированный взвешенный граф G. Вершины A, B принадлежат G. P
xy - вес ребра между вершинами X и Y. Необходимо найти max(∑ C
Ai).
∀X,Y: |C
xy| ≤ P
xy
∀X,Y: C
xy = -C
yx
∀X, X≠A,X≠B: ∑ C
Xi = 0
Упрощенный метод Флойда-Фалкерсона:
1. Найти произвольный путь из A в B: S=(A, i, j... k, B)
2. Найти его пропускную способность: C
1= min( P
Ai, P
ij..., P
kB )
3. Запомнить данный поток (Q - путь, набор C
1 для ребер).
4. Построить новый граф G'= G: P'
Ai= P
Ai - C
1, P'
ij= P
ij - C
1... P'
kB= P
kB - C
1. У одного ребра в рассматриваемом пути после пересчета P'=0. Считать, что через это ребро пути не образуются.
5. Повторять процедуру для новых графов, пока существует хотя бы один путь из A в B.
6. Общий макс. поток будет суперпозицией Q, полученных на всех итерациях цикла.
Попытки доказательства:
Пусть L - максимальная величина потока в G'. Допустим, L1 - максимальная величина потока в G, L1 > L+C
1. Тогда при вычитании из G пути потока Q в соответствии с шагом 4 алгоритма величина L1 уменьшаться на C
1 (поскольку именно на столько уменьшаются пропускные способности сотавляющих путь ребер, исходя из предположения, что либо 1.: в L1 через эти ребра проходит поток, и его величина уменьшится на C
1, если он равен C
1 - больше быть не может из-за наименшего ребра, либо 2.: величина потока C
x меньше, чем C
1, если его ограничивала пропускная способность другого ребра пути, нагруженного дополнительными потоками, и как раз уменьшение того ребра на C
1 сократило как величину рассматриваемого потока на C
x, так и суммарную величину других потоков в том ребре на оставшуюся величину C
1-C
x, либо на еще меньшую), то есть в G' будет существовать поток с величиной Lx = L1-C
1, Lx > L. Следовательно, L1 ≤ L+C
1. Далее, если из G' восстановить G, то к максимальному потоку G' можно будет добавить Q, так как будет существовать путь с необходимым запасом пропускной способности: ∀X,Y P
xy - C
xy ≤ C
1, то есть в G существует поток с величиной L
x=L+C
1. Так как L1 ≤ L+C
1, Lx будет максимальной величиной.
Ошибка в том, что через ребра S может проходить несколько параллельных потоков, и в предельном случае величина L1 может уменьшится на C
1*(|S|-1), где (|S|-1) - число ребер в пути S
На основании рассмотрения примера, в котором алгоритм не получит оптимальный результат, можно придти к выводу, что проблема заключается в неправильной ориентации потока в части ребер произвольно выбранного пути. В результате этого ребра теряют пропускную способность, которую можно было бы использовать для увеличения потока. Напрашивающийся вывод - не исключать ребра, а рассматривать возможность обращения потока в ребре при поиске очередного пути, то есть рассматривать граф как ориентированный, с парными противоположно направленными дугами между каждой парой вершин. Увеличение потока в одной из дуг повышает пропускную способность парной дуги на величину добавленного потока. Если в противоположной дуге уже есть поток, он уменьшается на величину добавляемого, при этом на ту же величину восстанавливается пропускная способность парной дуги, и уменьшается у текущей, если величина добавляемого потока больше имеющегося в парной дуге, парный поток обнуляется, пропускная способность парной дуги восстанавливается, после чего остаток потока применяется к текущему с соответствующим изменением пропускных способностей обеих дуг. Пропусная способность парных дуг в сумме всегда равна 2*P, где P - пропускная способность ребра в исходном неориентированном графе..
Еще вариант - перебрать все 2
|G| вариантов ориентации ребер в графе.. ::