Алгоритм Эдмондса-Карпа

Алгоритм Эдмондса-Карпа

Алгоритм Эдмондса-Карпа имеет время работы O(VE²), он быстрее, чем алгоритм Форд-Фулкерсон для плотных графов, т.е. график содержащий большое количество ребер (или дуг) в зависимости от количества вершин.

Алгоритм Эдмондса-Карпа идентичен алгоритму Форда-Фалкерсона, за исключением порядка поиска, используемого для определения возрастающего пути. Найденный путь должен быть кратчайшим путем с положительной пропускной способностью. Такой путь может быть найден ширина курса, предполагая, что все дуги имеют единичную длину. Обратите внимание, что длина возрастающего пути увеличивается с каждой итерацией.
Код из википедии
алгоритм ЭдмондсКарп
    вход: С[1..n, 1..n] (матрица емкости)
        Э[1..п, 1..?] (список соседей)
        с             (источник)
        ты             (Что ж)
    выход(максимальное значение расхода)
        Ф             (матрица, дающая действительный поток максимального значения)
    ф := 0 (начальный поток равен нулю)
    Ф:= множество(1..н, 1..н) ( остаточная мощность от u до v есть C[u,v] - F[u,v])
    навсегда
        m, P := Поиск в ширину (C, E, s, t, F)
        если м = 0
            ломать
        е := е + м
        (Бэктрек и поток нот)
        v := т
        пока v ≠ s u := P[v] F[u,v] := F[u,v] + m F[v,u] := F[v,u] - m v := u
    возвращаться (ж, ж)
алгоритм ШиротаFirstSearch
    вход: это ф
    выход: М[т]          (пропускная способность пути найдена)
        п             (родительская таблица)
    П:= множество(1..н)
    за а в 1..n P[u]:= -1 P[s]:= -2 (чтобы источник не был обнаружен повторно) 
    М:= множество(1..н) (мощность найденного пути к узлу)
    M[s] := ∞ Q := queue() Q.push(s)
    пока Q.size() > 0 u := Q.pop()
        за в в Европа]
            если C[u,v] - F[u,v] > 0 а также P[v] = -1 P[v] := u M[v] := min(M[u], C[u,v] - F[u,v])
                если v ≠ т Q.push(v)
                еще
                    возвращаться М[т], П
    возвращаться 0.П

Алгоритм Эдмондса-Карпа Максимальный поток Проблема максимального потока Минимальный разрез График отклонения Растущий поток

Делиться
ru_RURU