Алгоритм Эдмондса – Карпа - Edmonds–Karp algorithm
В Информатика, то Алгоритм Эдмондса – Карпа это реализация Метод Форда – Фулкерсона для вычисления максимальный поток в проточная сеть в время. Алгоритм был впервые опубликован Ефимом Диницем (имя которого также транслитерируется как «Э. А. Динич», в частности, как автор его ранних работ) в 1970 году.[1][2] и независимо опубликованы Джек Эдмондс и Ричард Карп в 1972 г.[3] Алгоритм диника включает дополнительные методы, которые сокращают время работы до .[2]
Алгоритм
Алгоритм идентичен алгоритму Алгоритм Форда – Фулкерсона, за исключением того, что порядок поиска при нахождении расширение пути определено. Найденный путь должен быть кратчайшим путем, имеющим доступную емкость. Это можно найти поиск в ширину, где мы применяем вес 1 к каждому ребру. Время работы находится, показывая, что каждый путь увеличения можно найти в раз, что каждый раз хотя бы один из края становятся насыщенными (край, который имеет максимально возможный поток), что расстояние от насыщенного края до источника вдоль пути увеличения должно быть больше, чем в последний раз, когда он был насыщен, и что длина не превышает . Еще одно свойство этого алгоритма состоит в том, что длина кратчайшего пути увеличения монотонно увеличивается. Есть доступное доказательство в Введение в алгоритмы.[4]
Псевдокод
алгоритм ЭдмондсКарп является Вход: график (граф [v] должен быть списком ребер, выходящих из вершины v в исходный график и их соответствующие построенные обратные ребра которые используются для обратного потока. Каждое ребро должно иметь в качестве параметров мощность, поток, источник и сток. а также указатель на обратный край.) s (Исходная вершина) т (Вершина раковины) выход: поток (Значение максимального расхода) расход: = 0 (Инициализировать поток до нуля) повторение (Выполните поиск в ширину (bfs), чтобы найти кратчайший путь s-t. Мы используем 'pred' для хранения ребра, сделанного, чтобы добраться до каждой вершины, чтобы потом мы могли восстановить путь) q: = очередь() q.push (s) pred: = множество(длина графика) пока нет пустой (q) cur: = q.pull () за Edge e в график [cur] делать если пред [e.t] = ноль и e.t ≠ s и e.cap> e.flow тогда pred [e.t]: = e q.push (e.t) если нет (пред [t] = ноль) тогда (Мы нашли дополнительный путь. Посмотрите, сколько потока мы можем отправить) df: = ∞ за (e: = pred [t]; e ≠ null; e: = pred [e.s]) делать df: = мин(df, e.cap - e.flow) (И обновите края на это количество) за (e: = pred [t]; e ≠ null; e: = pred [e.s]) делать e.flow: = e.flow + df e.rev.flow: = e.rev.flow - df flow: = flow + df до того как pred [t] = null (то есть до тех пор, пока не будет найден какой-либо дополнительный путь) возвращаться поток
Пример
Для сети из семи узлов, источника A, приемника G и емкости, как показано ниже:
В парах написано по краям, - текущий поток, а это емкость. Остаточная емкость от к является , общая производительность за вычетом расхода, который уже используется. Если чистый поток от к отрицательно, это способствует к остаточной емкости.
Емкость | Дорожка | Результирующая сеть |
---|---|---|
Обратите внимание, как длина расширение пути найденное алгоритмом (красным) никогда не уменьшается. Найденные пути - кратчайшие из возможных. Найденный поток равен пропускной способности через минимальный разрез в графе, разделяющем источник и сток. В этом графе есть только один минимальный разрез, разбивающий узлы на множества и , с емкостью
Примечания
- ^ Динич, Э.А. (1970). «Алгоритм решения задачи максимального потока в сети с оценкой мощности». Советская математика - Доклады. Доклады. 11: 1277–1280.
- ^ а б Ефим Диниц (2006). «Алгоритм Диница: исходная версия и версия даже» (PDF). В Одед Гольдрайх; Арнольд Л. Розенберг; Алан Л. Селман (ред.). Теоретическая информатика: очерки памяти Шимон Эвен. Springer. С. 218–240. ISBN 978-3-540-32880-3.
- ^ Эдмондс, Джек; Карп, Ричард М. (1972). «Теоретические улучшения алгоритмической эффективности для задач сетевого потока» (PDF). Журнал ACM. 19 (2): 248–264. Дои:10.1145/321694.321699.
- ^ Томас Х. Кормен, Чарльз Э. Лейзерсон, Рональд Л. Ривест и Клиффорд Штайн (2009). "26.2". Введение в алгоритмы (третье изд.). MIT Press. С. 727–730. ISBN 978-0-262-03384-8.CS1 maint: несколько имен: список авторов (связь)
Рекомендации
- Алгоритмы и сложность (см. Стр. 63–69). https://web.archive.org/web/20061005083406/http://www.cis.upenn.edu/~wilf/AlgComp3.html