Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину — различия между версиями
Строка 3: | Строка 3: | ||
== Идея == | == Идея == | ||
Идея алгоритма заключается в следующем. Изначально величине потока присваивается значение 0: <tex> f(u,v) = 0 </tex> для всех <tex> u, v </tex> из <tex> V </tex>. Затем величина потока итеративно увеличивается посредством поиска увеличивающего пути (путь от источника s к стоку t, вдоль которого можно послать больший поток). В данной статье рассматривается алгоритм, осуществляющий этот поиск с помощью [[Обход в глубину, цвета вершин|обхода в глубину (dfs)]]. Процесс повторяется, пока можно найти увеличивающий путь. | Идея алгоритма заключается в следующем. Изначально величине потока присваивается значение 0: <tex> f(u,v) = 0 </tex> для всех <tex> u, v </tex> из <tex> V </tex>. Затем величина потока итеративно увеличивается посредством поиска увеличивающего пути (путь от источника s к стоку t, вдоль которого можно послать больший поток). В данной статье рассматривается алгоритм, осуществляющий этот поиск с помощью [[Обход в глубину, цвета вершин|обхода в глубину (dfs)]]. Процесс повторяется, пока можно найти увеличивающий путь. | ||
+ | |||
+ | == Реализация == | ||
+ | dfs(u, Cmin) { | ||
+ | if (u = t) | ||
+ | return Cmin | ||
+ | u.vis <- true | ||
+ | for (uv \in E) | ||
+ | if (!v.vis) && (uv.f < uv.c) | ||
+ | дельта <- dfs(v, min(Cmin, uv.c - uv.f)) | ||
+ | if (дельта > 0) { | ||
+ | uv.f += дельта | ||
+ | uv.r.f -= дельта | ||
+ | return дельта | ||
+ | } | ||
+ | } | ||
== См. также == | == См. также == | ||
* [[Теорема Форда-Фалкерсона]] | * [[Теорема Форда-Фалкерсона]] |
Версия 23:43, 21 декабря 2010
Алгоритм Форда — Фалкерсона — алгоритм, решающий задачу нахождения максимального потока в транспортной сети.
Идея
Идея алгоритма заключается в следующем. Изначально величине потока присваивается значение 0: обхода в глубину (dfs). Процесс повторяется, пока можно найти увеличивающий путь.
для всех из . Затем величина потока итеративно увеличивается посредством поиска увеличивающего пути (путь от источника s к стоку t, вдоль которого можно послать больший поток). В данной статье рассматривается алгоритм, осуществляющий этот поиск с помощьюРеализация
dfs(u, Cmin) { if (u = t) return Cmin u.vis <- true for (uv \in E) if (!v.vis) && (uv.f < uv.c) дельта <- dfs(v, min(Cmin, uv.c - uv.f)) if (дельта > 0) { uv.f += дельта uv.r.f -= дельта return дельта } }