Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями — различия между версиями
Nikitaevg (обсуждение | вклад) (→Теоремы: Опечатка в доказательстве) |
Nikitaevg (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | Пусть <tex>N = (V,E,s,t,c)</tex> - [[Определение сети, потока|сеть]] с целочисленными пропускными способностями. | + | Пусть <tex>N = (V,E,s,t,c)</tex> {{---}} [[Определение сети, потока|сеть]] с целочисленными пропускными способностями. |
− | Обозначим <tex>C</tex> и <tex>F</tex> | + | Обозначим <tex>C = \max\limits_{uv \in E} c_{uv}</tex> и <tex>F</tex> как максимальный поток. |
<tex>c^{+}(v) = \sum\limits_{uv \in E} c_{uv}</tex>. | <tex>c^{+}(v) = \sum\limits_{uv \in E} c_{uv}</tex>. | ||
Строка 10: | Строка 10: | ||
<tex>c^{-}(v) = \sum\limits_{vu \in E} c_{vu}</tex>. | <tex>c^{-}(v) = \sum\limits_{vu \in E} c_{vu}</tex>. | ||
− | <tex>p(v) = min\big\{c^{+}(v), c^{-}(v)\big\}</tex> - потенциал вершины <tex>v</tex>. | + | <tex>p(v) = min\big\{c^{+}(v), c^{-}(v)\big\}</tex> {{---}} потенциал вершины <tex>v</tex>. |
Тогда общий потенциал выражается формулой: | Тогда общий потенциал выражается формулой: | ||
<tex>P = \sum\limits_{v \in V, v \neq s,t}p(v)</tex>. | <tex>P = \sum\limits_{v \in V, v \neq s,t}p(v)</tex>. | ||
− | [[Дополняющая сеть, дополняющий путь|Остаточную сеть]] обозначим <tex> | + | [[Дополняющая сеть, дополняющий путь|Остаточную сеть]] обозначим <tex>G_f</tex>. |
− | Обозначим длину [[Схема алгоритма Диница|слоистой сети]] <tex>l</tex> - как длину кратчайшего <tex>s-t</tex> пути в <tex> | + | Обозначим длину [[Схема алгоритма Диница|слоистой сети]] <tex>l</tex> {{---}} как длину кратчайшего <tex>s-t</tex> пути в <tex>G_f</tex>. |
}} | }} | ||
Строка 23: | Строка 23: | ||
|about = 1 | |about = 1 | ||
|statement= | |statement= | ||
− | Пусть <tex>l</tex> - расстояние между <tex>s</tex> и <tex>t</tex> в сети | + | Пусть <tex>l</tex> {{---}} расстояние между <tex>s</tex> и <tex>t</tex> в исходной сети, максимальный поток в этой сети равен <tex>F</tex>. |
− | Тогда <tex>l \ | + | Тогда <tex>l \leqslant \frac{P}{F} + 1</tex> |
|proof= | |proof= | ||
− | Пусть <tex>l</tex> - расстояние между <tex>s</tex> и <tex>t</tex>, а <tex>V_i</tex> - набор вершин, удаленных от <tex>s</tex> на <tex>i</tex> <tex>(i \ | + | Пусть <tex>l</tex> {{---}} расстояние между <tex>s</tex> и <tex>t</tex>, а <tex>V_i</tex> {{---}} набор вершин, удаленных от <tex>s</tex> на <tex>i</tex> <tex>(i \leqslant l)</tex>. |
− | <tex>V_i</tex> - разъединяющее множество узлов: при его удалении исчезают все пути из <tex>s</tex> в <tex>t</tex>. | + | <tex>V_i</tex> {{---}} разъединяющее множество узлов: при его удалении исчезают все пути из <tex>s</tex> в <tex>t</tex>. |
Следуя закону [[Определение сети, потока|сохранения потока]], если <tex>f</tex> обозначить как любой допустимый поток, то <tex>|f|</tex> единиц потока должно проходить через <tex>V_i</tex>. | Следуя закону [[Определение сети, потока|сохранения потока]], если <tex>f</tex> обозначить как любой допустимый поток, то <tex>|f|</tex> единиц потока должно проходить через <tex>V_i</tex>. | ||
Но суммарное количество потока, которое может проходить через любую вершину не превосходит ее потенциала. | Но суммарное количество потока, которое может проходить через любую вершину не превосходит ее потенциала. | ||
Отсюда, если обозначить <tex>P_i</tex> как общий потенциал вершин из <tex>V_i</tex>, то мы имеем: | Отсюда, если обозначить <tex>P_i</tex> как общий потенциал вершин из <tex>V_i</tex>, то мы имеем: | ||
− | <tex>|f| \ | + | <tex>|f| \leqslant P_i</tex> |
− | для любого допустимого потока <tex>f</tex>. В частности, <tex>F \ | + | для любого допустимого потока <tex>f</tex>. В частности, <tex>F \leqslant P_i</tex>, таким образом получаем: |
− | <tex>(l - 1)F \ | + | <tex>(l - 1)F \leqslant \displaystyle \sum_{i = 1}^{l - 1} P_i \leqslant P</tex> |
и лемма доказана. | и лемма доказана. | ||
Строка 46: | Строка 46: | ||
|about = 2 | |about = 2 | ||
|statement= | |statement= | ||
− | Пусть <tex> N </tex> - сеть, а <tex>f</tex> - допустимый поток в этой сети. Тогда общий потенциал в остаточной сети <tex> | + | Пусть <tex> N </tex> {{---}} сеть, а <tex>f</tex> {{---}} допустимый поток в этой сети. Тогда общий потенциал в остаточной сети <tex>G_f</tex> равен общему потенциалу <tex>N</tex>. |
|proof= | |proof= | ||
− | Пусть <tex>c_f</tex> - функция пропускных способностей в <tex> | + | Пусть <tex>c_f</tex> {{---}} функция пропускных способностей в <tex>G_f</tex>, а <tex>p_f(v), in_f(v), out_f(v)</tex> {{---}} потенциал, множество входящих ребер и множество выходящих ребер вершины <tex>v</tex> из <tex>G_f</tex>. |
Достаточно доказать, что <tex>p_f(v) = p(v)</tex>. Ребру <tex>e</tex> из <tex>in(v)</tex> соответствуют ребро <tex>e_1</tex> из <tex>in_f(v)</tex> с пропускной способностью <tex>c(e) - f(e)</tex>, и ребро <tex>e_2</tex> из <tex>out(v)</tex> с пропускной способностью <tex>f(e)</tex>. Аналогично, ребру <tex>e</tex> из <tex>out(v)</tex> соответствуют ребра из <tex>out_f(v)</tex> с пропускной способностью <tex>c(v) - f (v)</tex> и <tex>in_f(v)</tex> с пропускной способностью <tex>f(e)</tex>. Используя закон сохранения потока, нетрудно проверить, что | Достаточно доказать, что <tex>p_f(v) = p(v)</tex>. Ребру <tex>e</tex> из <tex>in(v)</tex> соответствуют ребро <tex>e_1</tex> из <tex>in_f(v)</tex> с пропускной способностью <tex>c(e) - f(e)</tex>, и ребро <tex>e_2</tex> из <tex>out(v)</tex> с пропускной способностью <tex>f(e)</tex>. Аналогично, ребру <tex>e</tex> из <tex>out(v)</tex> соответствуют ребра из <tex>out_f(v)</tex> с пропускной способностью <tex>c(v) - f (v)</tex> и <tex>in_f(v)</tex> с пропускной способностью <tex>f(e)</tex>. Используя закон сохранения потока, нетрудно проверить, что | ||
Строка 65: | Строка 65: | ||
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети <tex>N</tex> (<tex>s</tex> — исток, <tex>t</tex> — сток) с целочисленными пропускными способностями — <tex>O(\sqrt{P})</tex>. | |statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети <tex>N</tex> (<tex>s</tex> — исток, <tex>t</tex> — сток) с целочисленными пропускными способностями — <tex>O(\sqrt{P})</tex>. | ||
|proof= | |proof= | ||
− | Пусть <tex>F</tex> - максимальный поток в сети <tex>N</tex>. Теорема верна для <tex>F \ | + | Пусть <tex>F</tex> {{---}} максимальный поток в сети <tex>N</tex>. Теорема верна для <tex>F \leqslant \sqrt{P}</tex>, так как после каждой фазы поток увеличивается хотя бы на 1. Если <tex>F > \sqrt{P}</tex>, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем <tex>F - \sqrt{P}</tex>. После этого потребуется не больше <tex>\sqrt{P}</tex> фаз, чтобы найти максимальный поток. На предыдущей фазе поток (<tex>f</tex>) в <tex>N</tex> был не больше <tex>F-\sqrt{P}</tex>, таким образом <tex>F-|f| \geqslant \sqrt{P}</tex>. |
− | <tex> | + | <tex>G_f</tex> {{---}} сеть с максимальным потоком <tex>F-|f|</tex> и потенциалом <tex>P</tex> (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между <tex>s</tex> и <tex>t</tex> в <tex>G_f</tex>, и получить оценку длины <tex>l</tex> слоистой сети: |
− | <tex>l \ | + | <tex>l \leqslant \frac{P}{F-|f|} + 1</tex> |
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше <tex>\sqrt{P}</tex> фаз. Таким образом происходит не более <tex>2\sqrt{P}</tex> фаз. | Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше <tex>\sqrt{P}</tex> фаз. Таким образом происходит не более <tex>2\sqrt{P}</tex> фаз. | ||
Строка 77: | Строка 77: | ||
|about = 3 | |about = 3 | ||
|statement= | |statement= | ||
− | Пусть в сети <tex>N</tex> нет [[Основные определения теории графов#def1|параллельных ребер]]. <tex> | + | Пусть в сети <tex>N</tex> нет [[Основные определения теории графов#def1|параллельных ребер]]. Пусть <tex>F</tex> {{---}} максимальный поток в <tex>N</tex>. Тогда расстояние <tex>l</tex> между <tex>s</tex> и <tex>t</tex> в <tex>N</tex> таково: <tex>l \leqslant |V|\sqrt{\frac{2C}{F}} - 1</tex>. |
|proof= | |proof= | ||
− | Обозначим <tex>V_i</tex> как набор вершин на расстоянии <tex>i</tex> от <tex>s</tex>. Множества <tex>X = \bigcup_{i = 0}^k V_i</tex> и <tex>Y = V - X</tex> определяют разрез <tex>(X, Y)</tex>. Пропускная способность этого разреза не больше <tex>2C|V_k||V_{k + 1}|</tex>, так как все ребра между <tex>X</tex> и <tex>Y</tex> также являются ребрами между <tex>V_k</tex> и <tex>V_{k+1}</tex> и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, <tex>F \ | + | Обозначим <tex>V_i</tex> как набор вершин на расстоянии <tex>i</tex> от <tex>s</tex>. Множества <tex>X = \bigcup_{i = 0}^k V_i</tex> и <tex>Y = V - X</tex> определяют разрез <tex>(X, Y)</tex>. Пропускная способность этого разреза не больше <tex>2C|V_k||V_{k + 1}|</tex>, так как все ребра между <tex>X</tex> и <tex>Y</tex> также являются ребрами между <tex>V_k</tex> и <tex>V_{k+1}</tex> и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, <tex>F \leqslant 2C|V_k||V_{k+1}|</tex>. |
− | Таким образом <tex>F</tex> ограничен наименьшим из <tex>|V_k||V_{k+1}|</tex>. Но эта величина максимальна, когда <tex>|V_i| = |V|/(l+1)</tex> для <tex>0 \ | + | Таким образом <tex>F</tex> ограничен наименьшим из <tex>|V_k||V_{k+1}|</tex>. Но эта величина максимальна, когда <tex>|V_i| = |V|/(l+1)</tex> для <tex>0 \leqslant i \leqslant n</tex>, таким образом <tex>F \leqslant 2C|V|^2 / (l+1)^2</tex>. Выражая <tex>l</tex>, получаем нужное. |
}} | }} | ||
Строка 86: | Строка 86: | ||
|id=th2 | |id=th2 | ||
|about=Вторая теорема Карзанова | |about=Вторая теорема Карзанова | ||
− | |statement=Число итераций алгоритма Диница с целочисленными пропускными способностями - <tex>O(C^{1/3}|V|^{2/3})</tex>. | + | |statement=Число итераций алгоритма Диница с целочисленными пропускными способностями {{---}} <tex>O(C^{1/3}|V|^{2/3})</tex>. |
|proof= | |proof= | ||
− | Если <tex>F \ | + | Если <tex>F \leqslant C^{1/3}|V|^{2/3}</tex>, то теорема очевидна. |
− | Положим, что <tex>F > C^{1/3}|V|^{2/3}</tex>, и рассотрим последнюю фазу, в которой поток <tex>f</tex> не превышает <tex>F - C^{1/3}|V|^{2/3}</tex>. В этот момент осталось не более <tex>C^{1/3}|V|^{2/3} + 1</tex> фаз, и <tex> | + | Положим, что <tex>F > C^{1/3}|V|^{2/3}</tex>, и рассотрим последнюю фазу, в которой поток <tex>f</tex> не превышает <tex>F - C^{1/3}|V|^{2/3}</tex>. В этот момент осталось не более <tex>C^{1/3}|V|^{2/3} + 1</tex> фаз, и <tex>G_f</tex> {{---}} сеть с максимальным потоком <tex>F - |f| \ge C^{1/3}|V|^{2/3}</tex>. Мы можем применить Лемму(3), чтобы оценить длину <tex>l</tex> слоистой сети, и, соответственно, количество выполненных фаз: |
− | <tex>l \ | + | <tex>l \leqslant |V|{(\frac{2C}{F-|f|})}^{1/2} - 1 \leqslant 2^{1/2}C^{1/3}|V|^{2/3} - 1</tex>. |
− | |||
− | |||
Таким образом, прошло <tex>O(C^{1/3}|V|^{2/3})</tex> фаз, и <tex>O(C^{1/3}|V|^{2/3})</tex> фаз осталось. Теорема доказана. | Таким образом, прошло <tex>O(C^{1/3}|V|^{2/3})</tex> фаз, и <tex>O(C^{1/3}|V|^{2/3})</tex> фаз осталось. Теорема доказана. | ||
Строка 100: | Строка 98: | ||
== Литература == | == Литература == | ||
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel] | * [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel] | ||
+ | * [https://www.youtube.com/watch?v=sEwp5ZAJJps&feature=youtu.be&t=26m41s Андрей Станкевич: Лекториум, дополнительные главы алгоритмов, лекция 12] | ||
[[Категория:Алгоритмы и структуры данных]] | [[Категория:Алгоритмы и структуры данных]] | ||
[[Категория:Задача о максимальном потоке]] | [[Категория:Задача о максимальном потоке]] |
Версия 11:00, 31 декабря 2016
Определения
Определение: |
Пусть сеть с целочисленными пропускными способностями.
Обозначим и как максимальный поток.. . — потенциал вершины . Тогда общий потенциал выражается формулой: .Остаточную сеть обозначим . Обозначим длину слоистой сети — как длину кратчайшего пути в . | —
Теоремы
Лемма (1): |
Пусть — расстояние между и в исходной сети, максимальный поток в этой сети равен .
Тогда |
Доказательство: |
Пусть сохранения потока, если обозначить как любой допустимый поток, то единиц потока должно проходить через . Но суммарное количество потока, которое может проходить через любую вершину не превосходит ее потенциала. Отсюда, если обозначить как общий потенциал вершин из , то мы имеем: — расстояние между и , а — набор вершин, удаленных от на . — разъединяющее множество узлов: при его удалении исчезают все пути из в . Следуя закону
для любого допустимого потока . В частности, , таким образом получаем:и лемма доказана. |
Лемма (2): |
Пусть — сеть, а — допустимый поток в этой сети. Тогда общий потенциал в остаточной сети равен общему потенциалу . |
Доказательство: |
Пусть — функция пропускных способностей в , а — потенциал, множество входящих ребер и множество выходящих ребер вершины из .Достаточно доказать, что . Ребру из соответствуют ребро из с пропускной способностью , и ребро из с пропускной способностью . Аналогично, ребру из соответствуют ребра из с пропускной способностью и с пропускной способностью . Используя закон сохранения потока, нетрудно проверить, что
и что и требовалось доказать. |
Теорема (Первая теорема Карзанова): |
Число итераций алгоритма Диница в сети ( — исток, — сток) с целочисленными пропускными способностями — . |
Доказательство: |
Пусть — максимальный поток в сети . Теорема верна для , так как после каждой фазы поток увеличивается хотя бы на 1. Если , рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем . После этого потребуется не больше фаз, чтобы найти максимальный поток. На предыдущей фазе поток ( ) в был не больше , таким образом .— сеть с максимальным потоком и потенциалом (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между и в , и получить оценку длины слоистой сети: Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше фаз. Таким образом происходит не более фаз. |
Лемма (3): |
Пусть в сети параллельных ребер. Пусть — максимальный поток в . Тогда расстояние между и в таково: . нет |
Доказательство: |
Обозначим Таким образом как набор вершин на расстоянии от . Множества и определяют разрез . Пропускная способность этого разреза не больше , так как все ребра между и также являются ребрами между и и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, . ограничен наименьшим из . Но эта величина максимальна, когда для , таким образом . Выражая , получаем нужное. |
Теорема (Вторая теорема Карзанова): |
Число итераций алгоритма Диница с целочисленными пропускными способностями — . |
Доказательство: |
Если , то теорема очевидна. Положим, что , и рассотрим последнюю фазу, в которой поток не превышает . В этот момент осталось не более фаз, и — сеть с максимальным потоком . Мы можем применить Лемму(3), чтобы оценить длину слоистой сети, и, соответственно, количество выполненных фаз:Таким образом, прошло . фаз, и фаз осталось. Теорема доказана. |