En informática , el algoritmo de Edmonds-Karp es una implementación del método Ford-Fulkerson para calcular el flujo máximo en una red de flujo en el tiempo. El algoritmo fue publicado por primera vez por Yefim Dinitz en 1970, [1] [2] y publicado de forma independiente por Jack Edmonds y Richard Karp en 1972. [3] El algoritmo de Dinitz incluye técnicas adicionales que reducen el tiempo de ejecución a . [2]
El algoritmo es idéntico al algoritmo de Ford-Fulkerson , excepto que se define el orden de búsqueda al encontrar la ruta aumentada . El camino encontrado debe ser un camino más corto que tenga capacidad disponible. Esto se puede encontrar mediante una búsqueda en amplitud , donde aplicamos un peso de 1 a cada borde. El tiempo de ejecución de se encuentra mostrando que cada camino de aumento se puede encontrar en el tiempo, que cada vez que al menos uno de los bordes se satura (un borde que tiene el máximo flujo posible), que la distancia desde el borde saturado hasta la fuente a lo largo del camino de aumento debe ser más largo que la última vez que se saturó, y que la longitud sea como máximo . Otra propiedad de este algoritmo es que la longitud del camino de aumento más corto aumenta de forma monótona. Hay una prueba accesible en Introducción a los algoritmos . [4]
Se introduce el algoritmo EdmondsKarp : gráfico (gráfico [v] debe ser la lista de aristas que salen del vértice v en el gráfico original y sus correspondientes aristas inversas construidas que se utilizan para el flujo de retroceso. Cada arista debe tener una capacidad 'cap', flow, source ' s' y sumidero 't' como parámetros, así como un puntero al borde inverso 'rev'.) Salida s ( vértice de origen) t (vértice de sumidero) : caudal (Valor del caudal máximo) flujo: = 0 (Inicializar el flujo a cero) repetir (Ejecutar una búsqueda en amplitud (bfs) para encontrar la ruta st más corta. Usamos 'pred' para almacenar el borde tomado para llegar a cada vértice, para que podamos recuperar la ruta después) q := cola () q.push(s) pred := matriz (graph.length) mientras no esté vacío (q) y pred[t] = null cur := q.pop() para Edge e en el gráfico [cur], haga si pred[et] = null y et ≠ s y e.cap > e.flow entonces pred[et] := e q.push(et) si no (pred[t] = null) entonces (Encontramos una ruta de aumento. Vea cuánto flujo podemos enviar) df := ∞ for (e := pred[t]; e ≠ null; e := pred[es ]) do df := min (df, e.cap - e.flow) (Y actualice los bordes en esa cantidad) for (e := pred[t]; e ≠ null; e := pred[es]) do e.flujo := e.flujo + df e.rev.flujo := e.rev.flujo - df flujo := flujo + df hasta pred[t] = null (es decir, hasta que no se encuentre una ruta de aumento) flujo de retorno
Dada una red de siete nodos, fuente A, sumidero G y capacidades como se muestra a continuación:
En los pares escritos en los bordes, está el flujo de corriente y es la capacidad. La capacidad residual de a es la capacidad total, menos el flujo que ya se utiliza. Si el flujo neto desde a es negativo, contribuye a la capacidad residual.
Observe cómo la longitud de la ruta de aumento encontrada por el algoritmo (en rojo) nunca disminuye. Los caminos encontrados son los más cortos posibles. El caudal encontrado es igual a la capacidad a través del corte mínimo en el gráfico que separa la fuente y el sumidero. Sólo hay un corte mínimo en este gráfico, dividiendo los nodos en los conjuntos y , con la capacidad
{{cite book}}
: CS1 maint: multiple names: authors list (link)