Изменения

Перейти к: навигация, поиск

Циркуляция потока

1940 байт добавлено, 19:19, 4 сентября 2022
м
rollbackEdits.php mass rollback
<wikitex>==Определение==
{{Определение
|definition=
'''Циркуляцией''' называется поток Поток нулевой величины в [[Определение сети, потока|сети]] $G(V, E)$ величины нольназывается '''циркуляцией''' (англ. ''circulation problem''). Каждое ребро $e_i$ имеет $l_i$ и $c_i$ {{---}} минимальная и максимальная пропускная способности соответственно. Необходимо выяснить, существует ли в этой сети циркуляция, удовлетворяющая пропускным способностям рёбер.
}}
[[Файл:Циркул2.png|frame|справа|Рисунок 1. Пример графа и циркуляции в нем (поток/пропуск.способность)]]
То есть Иначе говоря, [[Определение сети, потока#Определение потока|закон сохранения потока ]] <tex>\sum\limits_v f(u,v)=0</tex> должен выполняться для '''всех''' без исключения вершин графа. Фактически, а значит нет нужды в истоке и стоке.</wikitex>==Постановка задачи==<wikitex>Рассмотрим сеть Когда все $G(V, E)l_i$, в которой про каждое ребро равны $e_i0$ известны , достаточно пустить поток нулевой величины: $l_i$ {{---}} минимальная пропускная способность из каждой вершины, что и $c_i$ {{---}} максимальная пропускная способностьбудет ответом. Необходимо выяснить, существует ли Поэтому далее в этой сети циркуляция, удовлетворяющая требованиям, наложенным на пропускные способностиграфе будут существовать рёбра с положительной нижней пропускной способностью.
Если рассматривать тривиальный случай==Решение==Для решения этой задачи заменим исходную сеть $G$ на $G'$ следующим образом. Сначала добавим в граф вершины $s$ {{---}} исток и $t$ {{---}} сток. Для каждого ребра $e_i = v_{from} \xrightarrow{l_i, когда все c_i} v_{to}$добавим рёбра $s \xrightarrow{0, l_i = } v_{to}$ и $u_{from} \xrightarrow{0, l_i} t$, то достаточно пустить поток величины ноль из каждой вершиныа также сделаем в ребре $e_i$ изменения: $c_i = c_i - l_i, что l_i = 0$ (см. рисунок 2). [[Файл:Циркуляция.png|frame|center|Рисунок 2. Слева - изначальный граф. Для каждого ребра заданы его нижняя и будет ответомверхняя пропускные способности. Поэтому далее в графе будут существовать ребра с положительно нижней пропускной способностьюСправа - граф после преобразований рёбер. </wikitex>]]
Каждое ребро изначального графа заменяется на три новых. Если по ребру $e_i ==Решение==<wikitex>Для решения этой задачи нам понадобится изменить исходную сеть $G(v_{from}, v_{to})$ в исходной сети протекает поток $G'l_i \leqslant f_i \leqslant c_i$ следующим образом. Сначала добавим , то в граф вершины $xновой сети по ребру $ (s, v_{{---to}} новый исток и )$ должен течь поток, равный $yl_i$ {{---}} новый сток, то есть его пропускной способности. Для каждого ребра Поток, который вытекает из $e_i = v_{from} \xrightarrow{l_i$ по ребру в $G$, заменяется на поток, c_i} который протекает по рёбрам $(v_{tofrom}$ добавим ребра $x \xrightarrow{0, l_i} v_{to})$ и $u_(v_{from} \xrightarrow, t)$ (поскольку сумма их пропускных способностей в полученном графе равна $c_i$). Аналогично, для вершины $v_{0, l_ito} y$суммарный входящий поток не изменился. Таким образом, а также сделаем любой допустимый поток по любому ребру в ребре изначальном графе можно распределить между тремя рёбрами в полученном графе. Заметим, что в сети $e_iG'$ изменения: все $c_i = c_i - l_i, l_i = 0$, то есть мы имеем обыкновенную сеть.
Проанализируем новую сеть. Каждое ребро изначального Требовалось найти циркуляцию в исходной сети, а значит проверить существование потока, для которого выполнено равенство <tex>\sum\limits_v f(u,v) = 0</tex> для всех вершин графа мы заменили на три новых. Тот факт, что по изначальному ребру Это равносильно существованию потока между вершинами $e_is$ должен течь поток и $l_i \leqslant f_i \leqslant c_it$ означает, что в новой сети по ребру $(x, v_{to})G'$ должен течь поток, равный $l_i$который полностью насытит рёбра, то есть его пропускной способностиисходящие из истока. ПотокДействительно, который раньше мог вытекать из этот поток в исходном графе насытит $i$-ое ребро как минимум на $v_{from}l_i$ по изначальному ребру, заменяется на что и является необходимым требованием. Если этот потоксуществует, который может течь по ребрам то будет выполнено:* $\sum\limits_v f(v_{from}u, v_{to}v)=0,$ и где $(v_u \in V'-\{froms,t\}, y)v \in V'$ (это ясно из того, что сумма их пропускных способностей в полученном графе равна то есть для всех исходных вершин;* В $G': f_i \leqslant c_i - l_i \Rightarrow 0 \leqslant f_i \leqslant c_i - l_i \Rightarrow l_i \leqslant f_i + l_i \leqslant c_i$). То же самое верно и в вершине $v_{to}$, куда суммарный возможный входящий поток не изменилсячто удовлетворяет всем ограничениям. Таким образом, ясноЗначит, что любой допустимый этот поток по любому ребру в изначальном графе можно распределить между тремя ребрами в полученном графе. Заметим, что в этом самом графе все $l_i = 0$, то и есть мы имеем обыкновенную сетьциркуляция.
От нас требовалось найти циркуляцию Запустим в исходной новой сети, то есть проверить, есть ли такой поток, что <tex>\sum\limits_v f(u,v)=0</tex> выполнено для всех вершин этого графаодин из алгоритмов поиска максимального потока. Но это равносильно существованию потока между вершинами $x$ и $y$ в сети $G'$, который Если он не смог полностью насытит ребра, исходящие насытить все рёбра из истока. Действительно, этот факт будет означать, что этот поток в исходном графе насытит $i$-ое ребро как минимум на $l_i$, то и является нужным требованием. Если этот никакой другой по величине поток существуетэтого сделать не сможет, то мы будем иметь:* $\sum\limits_v f(uзначит,v)=0,$ где $u \in V'-\{x,y\}, v \in V'$, то есть для всех исходных вершин;* В циркуляции нет. Для получения величин потоков вдоль каждого ребра в изначальной сети достаточно прибавить к потокам вдоль рёбер в сети $G': f_i \leqslant c_i - l_i \Rightarrow 0 \leqslant f_i \leqslant c_i - l_i \Rightarrow l_i \leqslant f_i \leqslant c_i$, то есть все удовлетворяет ограничениям.то есть '''циркуляцию'''соответствующие значения минимальной пропускной способности.
Запустим в новой сети один из алгоритмов поиска максимального потока. Если он не смог полностью насытить все ==Псевдокод==Конструктор ребра принимает следующие аргументы:* <tex>\mathtt{from}</tex> {{---}} вершина начала ребра* <tex>\mathtt{to}</tex> {{---}} вершина конца ребра* <tex>\mathtt{minCap}</tex> {{---}} минимальная пропускная способность ребра* <tex>\mathtt{maxCap}</tex> {{---}} максимальная пропускная способность ребра их истока '''function''' circulation(<tex>V, то E</tex>): <tex>G'=</tex> (<tex>V \cup s \cup t</tex>, <tex>\varnothing</tex>) <font color=green>// создаём новый граф с исходными вершинами и никакой другой по величине поток этого сделать не сможетдобавлением s и t {{---}} исток и сток</font> '''for''' <tex>e : e\in E</tex> <tex>g</tex> = Edge(<tex>s</tex>, <tex>e</tex>.to, <tex>0</tex>, <tex>e</tex>.minCap) <tex>h</tex> = Edge(<tex>e</tex>.from, <tex>e</tex>.to, значит<tex>0</tex>, циркуляции нет<tex>e</tex>. Для получения величин потоков по каждому ребру изначальной сети в случаеmaxCap - <tex>e</tex>.minCap) <tex>k</tex> = Edge(<tex>e</tex>.from, <tex>t</tex>, <tex>0</tex>, если циркуляция есть<tex>e</tex>.minCap) <tex>G'=G' \cup </tex>(<tex>\varnothing</tex>, достаточно просто прибавить к потокам <tex>g \cup h \cup k</tex>) maxFlow = getMaxFlow(<tex>G'</tex>) <font color=green>// наибольший поток в ребрах $графе G'</font> '''for''' <tex>e: e\in E'_i$ величины $l_i$</tex> '''and''' <tex>e</tex>.from <tex>=s</tex> '''if''' <tex>f</wikitextex>(<tex>e</tex>) <tex> < e</tex>.maxCap <font color=green>// если для текущего ребра flow < cap</font> '''return''' false '''return''' true
==Источникиинформации==* [http://e-maxx.ru/algo/flow_with_limits e-maxx]
* [http://dl.dropbox.com/u/39566886/Graph-Theory-Algorithms-M-Ashraf-Iqbal.pdf M. Ashraf Iqbal {{---}}'''Graph Theory and Algorithms''']
* [http://e-maxx.ru/algo/flow_with_limits MAXimal :: algo :: flow with limits]
* [https://en.wikipedia.org/wiki/Circulation_problem Wikipedia — Circulation problem]
 
[[Категория:Алгоритмы и структуры данных]]
[[Категория:Задача о максимальном потоке]]
1632
правки

Навигация