Algoritmo de Edmonds-Karp
En la informática, la 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 O()SilencioVSilencioSilencioESilencio2){displaystyle O(vivir a la vida eterna)} tiempo. El algoritmo fue publicado por primera vez por Yefim Dinitz (cuyo nombre también es transliterado "E. A. Dinic", en particular como autor de sus primeros trabajos) en 1970 y publicado independientemente por Jack Edmonds y Richard Karp en 1972. El algoritmo de Dinic incluye técnicas adicionales que reducen el tiempo de funcionamiento a O()SilencioVSilencio2SilencioESilencio){displaystyle O(las personas que viven en la vida eterna)}.
Algoritmo
El algoritmo es idéntico al algoritmo Ford-Fulkerson, excepto que el orden de búsqueda al encontrar el camino de aumento se define. El camino encontrado debe ser un camino más corto que tiene capacidad disponible. Esto se puede encontrar por una búsqueda de amplitud, donde aplicamos un peso de 1 a cada borde. El tiempo de funcionamiento O()SilencioVSilencioSilencioESilencio2){displaystyle O(vivir a la vida eterna)} se encuentra mostrando que cada camino de aumento se puede encontrar en O()SilencioESilencio){displaystyle O(viviendas)} que cada vez al menos uno de los E{displaystyle E} los bordes se saturan (un borde que tiene el máximo flujo posible), que la distancia del borde saturado a la fuente a lo largo del camino de aumento debe ser más largo que la última vez que se saturado, y que la longitud es en la mayoría SilencioVSilencio{displaystyle Silencioso. Otra propiedad de este algoritmo es que la longitud de la ruta de aumento más corta aumenta monotonicamente. Hay una prueba accesible en Introducción a los algoritmos.
Pseudocódigo
algoritmo Edmonds Karp es entrada: Gráfico (gráfico[v] debe ser la lista de bordes saliendo de v v v v v v en el Gráfico original y sus correspondientes bordes reversos construidos que se utilizan para el flujo de retroceso. Cada borde debe tener una capacidad, flujo, fuente y lavabo como parámetros, así como un puntero al borde inverso.)s (Fuente vértice)t (Sink vertex) Producto: flujo (Valor del flujo máximo)flujo:= 0 (Initializar el flujo a cero) repetición (Pon una búsqueda de la primera (bfs) para encontrar el camino más corto s-t. Usamos 'pred' para almacenar el borde tomado para llegar a cada vértice, para que podamos recuperar el camino después)q:= queue() q.push(s) pred:= array(graph.length) mientras no vacío(q) cur:= q.pop() para Edge e dentro gráfico[cur] do si pred[e.t] = nulo y e.t ل s y e.cap entoncespred[e.t]:= e q.push(e.t) si no (pred[t] = null) entonces (Encontramos un camino creciente. Vea cuánto flujo podemos enviar) df:= JUEGO para (e:= pred[t]; e ل null; e:= pred[e.s]) dodf:= min(df, e.cap - e.flow) (Y actualizar los bordes por esa cantidad) para (e:= pred[t]; e ل null; e:= pred[e.s]) doe.flow:= e.flow + df e.rev.flow:= e.rev.flow - df flujo:= flujo + df hasta pred[t] = null (es decir, hasta que no se encontró ningún camino de aumento) retorno flujo
Ejemplo
Dada una red de siete nodos, fuente A, sumidero G y capacidades como se muestra a continuación:
En los pares f/c{displaystyle f/c} escrito en los bordes, f{displaystyle f} es el flujo actual, y c{displaystyle c} es la capacidad. Capacidad residual de u{displaystyle u} a v{displaystyle v} es cf()u,v)=c()u,v)− − f()u,v){displaystyle c_{f}(u,v)=c(u,v)-f(u,v)}, la capacidad total, menos el flujo que ya se utiliza. Si la red fluye de u{displaystyle u} a v{displaystyle v} es negativo, contribuyentes 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 flujo encontrado es igual a la capacidad a través del corte mínimo en el gráfico que separa la fuente y el lavabo. Sólo hay un corte mínimo en este gráfico, partiendo los nodos en los conjuntos {}A,B,C,E}{displaystyle {A,B,C,E} y {}D,F,G}{displaystyle {D,F,G}, con la capacidad
- c()A,D)+c()C,D)+c()E,G)=3+1+1=5.{displaystyle c(A,D)+c(C,D)+c(E,G)=3+1=5. }
Contenido relacionado
Biblioteca
Kamov Ka-25
Teclado