viernes, 28 de junio de 2019

LISTAS RELACIONADAS CON LAS MATEMÁTICAS - ALGORITMOS


De Wikipedia, la enciclopedia libre
Saltar a navegaciónSaltar a búsqueda
Una gráfica y dos de sus cortes. La línea de puntos en rojo es un corte con tres bordes que se cruzan. La línea discontinua en verde es un corte mínimo de este gráfico, que solo cruza dos bordes.
En informática y teoría de gráficos , el algoritmo de Karger es un algoritmo aleatorio para calcular un corte mínimo de un gráficoconectado Fue inventado por David Karger y publicado por primera vez en 1993. [1]
La idea del algoritmo se basa en el concepto de contracción de un borde. en un grafo no dirigido Hablando de manera informal, la contracción de un borde fusiona los nodos. y en uno, reduciendo el número total de nodos del gráfico en uno. Todos los otros bordes que conectan o se "vuelven a unir" al nodo combinado, produciendo efectivamente un multigraph . El algoritmo básico de Karger contrae iterativamente bordes elegidos al azar hasta que solo quedan dos nodos; Esos nodos representan un corte en la gráfica original. Al iterar este algoritmo básico un número suficiente de veces, se puede encontrar un corte mínimo con alta probabilidad.




El problema de corte mínimo global editar ]

Un corte  en un grafo no dirigido  Es una partición de los vértices.  en dos conjuntos no vacíos, desunidos El cutset de un corte consiste en los bordes.entre las dos partes. El tamaño (o peso ) de un corte en un gráfico no ponderado es la cardinalidad del cutset, es decir, el número de bordes entre las dos partes,
Existen  Formas de elegir para cada vértice si pertenece a  o para , pero dos de estas elecciones hacen  o Vacíos y no dan lugar a cortes. Entre las opciones restantes, intercambiar los roles de y no cambia el corte, por lo que cada corte se cuenta dos veces; por lo tanto, haydistintos cortes. El problema de corte mínimo es encontrar un corte de tamaño más pequeño entre estos cortes.
Para gráficos ponderados con ponderaciones de borde positivas.  El peso del corte es la suma de los pesos de los bordes entre vértices en cada parte.
que concuerda con la definición no ponderada de .
Un corte a veces se denomina "corte global" para distinguirlo de un "corte global".- cortar ”para un par de vértices dado, que tiene el requisito adicional de que  y Cada corte global es un- cortar para algunos Por lo tanto, el problema de corte mínimo se puede resolver en tiempo polinomial mediante la iteración de todas las opciones de y resolviendo el mínimo resultante. -problema de corte usando el teorema de corte mínimo de flujo máximo y un algoritmo de tiempo polinomial para el flujo máximo , como el algoritmo push-reetiquetado , aunque este enfoque no es óptimo. Los mejores algoritmos deterministas para el problema de corte mínimo global incluyen el algoritmo Stoer-Wagner , que tiene un tiempo de ejecución de[2]

Algoritmo de contracción editar ]

La operación fundamental del algoritmo de Karger es una forma de contracción del borde . El resultado de contraer el borde. es nuevo nodo Cada borde o  para  a los puntos finales del borde contratado se sustituye por un borde al nuevo nodo. Finalmente, los nodos contratados. y Con todos sus bordes incidentes se eliminan. En particular, el gráfico resultante no contiene auto-bucles. El resultado de la contratación de ventaja. se denota .
El borde marcado se contrae en un solo nodo.
El algoritmo de contracción contrata repetidamente bordes aleatorios en el gráfico, hasta que solo quedan dos nodos, momento en el que solo hay un corte único.
Ejecución exitosa del algoritmo de Karger en un gráfico de 10 vértices. El corte mínimo tiene tamaño 3.
   contrato de trámite ():
    mientras 
       escoger  uniformemente al azar
       
   devuelve el único corte en
Cuando el gráfico se representa mediante listas de adyacencia o una matriz de adyacencia , se puede implementar una única operación de contracción de borde con un número lineal de actualizaciones a la estructura de datos, para un tiempo total de ejecución deAlternativamente, el procedimiento se puede ver como una ejecución del algoritmo de Kruskal para construir el árbol de expansión mínimo en un gráfico donde los bordes tienen pesos de acuerdo con una permutación aleatoria Eliminar el borde más pesado de este árbol da como resultado dos componentes que describen un corte. De esta manera, el procedimiento de contracción se puede implementar como el algoritmo de Kruskal en el tiempo..
Las opciones de bordes aleatorios en el algoritmo de Karger corresponden a una ejecución del algoritmo de Kruskal en un gráfico con rangos de bordes aleatorios hasta que solo quedan dos componentes.
El mejor uso de implementaciones conocidas.  tiempo y espacio, o  tiempo y espacio, respectivamente. [1]

Probabilidad de éxito del algoritmo de contracción editar ]

En una grafica  con  vértices, el algoritmo de contracción devuelve un corte mínimo con una probabilidad polinomialmente pequeña Cada grafica tienecortes, [3] entre los cuales a lo sumoPueden ser cortes mínimos. Por lo tanto, la probabilidad de éxito de este algoritmo es mucho mejor que la probabilidad de elegir un corte al azar, que es como máximo
Por ejemplo, el gráfico del ciclo en vértices tiene exactamente Cortes mínimos, dados por cada elección de 2 aristas. El procedimiento de contracción encuentra cada uno de estos con la misma probabilidad.
Para establecer el límite de la probabilidad de éxito en general, vamos a  denota los bordes de un corte mínimo específico de tamaño El algoritmo de contracción devuelve si ninguno de los bordes al azar pertenece al cutset de En particular, la primera contracción del borde evita, lo que pasa con probabilidad El grado mínimo de Por lo menos  (De lo contrario, un vértice de grado mínimo induciría un corte más pequeño), por lo que Por lo tanto, la probabilidad de que el algoritmo de contracción elija un borde de es
La probabilidad  que el algoritmo de contracción en una El gráfico de vértices evita  satisface la recurrencia , con , que se puede ampliar como

Repitiendo el algoritmo de contracción editar ]

10 repeticiones del procedimiento de contracción. La quinta repetición encuentra el corte mínimo de tamaño 3.
Repitiendo el algoritmo de contracción.  veces con opciones aleatorias independientes y devolviendo el corte más pequeño, la probabilidad de no encontrar un corte mínimo es
El tiempo total de ejecución para  repeticiones para una gráfica con vértices y  bordes es .

Algoritmo de Karger-Stein editar ]

Una extensión del algoritmo de Karger debido a David Karger y Clifford Stein logra una mejora de un orden de magnitud. [4]
La idea básica es realizar el procedimiento de contracción hasta que el gráfico alcance  vértices.
   contrato de trámite (, ):
    mientras 
       escoger  uniformemente al azar
       
   regreso 
La probabilidad  Que este procedimiento de contracción evita un corte específico.  en una -vertex gráfico es
Esta expresión es de aproximadamente  y se vuelve menos que  alrededor En particular, la probabilidad de que un borde deSe contrae crece hacia el final. Esto motiva la idea de cambiar a un algoritmo más lento después de un cierto número de pasos de contracción.
   procedimiento fastmincut ():
    si :
        devolver mincut ()
    Otra cosa :
       
        contrato(, )
        contrato(, )
        return min {fastmincut (), fastmincut ()}

Análisis editar ]

La probabilidad  El algoritmo encuentra un cutset específico.  Está dada por la relación de recurrencia.
con solucion El tiempo de ejecución de fastmincut satisface
con solucion Para lograr la probabilidad de error, el algoritmo se puede repetir  tiempos, para un tiempo total de ejecución de Esto es una mejora de un orden de magnitud sobre el algoritmo original de Karger.

Encontrando todos los min-cortes editar ]

Teorema: con alta probabilidad podemos encontrar todos los cortes mínimos en el tiempo de ejecución de.
Prueba: sabemos quePor lo tanto, después de ejecutar este algoritmo.  veces la probabilidad de perder un corte mínimo específico es
.
Y hay a lo sumo  Los cortes mínimos, por lo tanto, la probabilidad de perder cualquier corte mínimo es
La probabilidad de fallos es considerablemente pequeña cuando n es lo suficientemente grande.

Límite de mejora editar ]

Para determinar un corte mínimo, uno tiene que tocar todos los bordes del gráfico al menos una vez, lo cual es Tiempo en una gráfica densa . El algoritmo de corte mínimo de Karger-Stein toma el tiempo de ejecución de, que está muy cerca de eso.









 algoritmo push-reetiquetado (alternativamente, el algoritmo preflow-push ) es un algoritmo para calcular flujos máximos . El nombre "push-reetiquetado" proviene de las dos operaciones básicas utilizadas en el algoritmo. A lo largo de su ejecución, el algoritmo mantiene un "preflujo" y lo convierte gradualmente en un flujo máximo moviendo el flujo localmente entre nodos vecinos utilizando operaciones de empuje bajo la guía de una red admisible mantenida por operaciones de etiquetado . En comparación, el algoritmo Ford-Fulkerson realiza aumentos globales que envían flujos siguiendo las rutas desde la fuente hasta el sumidero. [1]
El algoritmo push-reetiqueta se considera uno de los algoritmos de flujo máximo más eficientes. El algoritmo genérico tiene una complejidad de tiempo O (  2 E ) fuertemente polinómica , que es asintóticamente más eficiente que el algoritmo Edmonds-Karp O ( VE  2 ) . [2] Las variantes específicas de los algoritmos logran complejidades de tiempo aún más bajas. La variante basada en la regla de selección de nodo de etiqueta más alta tiene una complejidad de tiempo O (  2 √ E ) y generalmente se considera como el punto de referencia para los algoritmos de flujo máximo. [3] [4] La complejidad del tiempo de la subcubic O ( registro de VE (  2 / E )) se puede lograr utilizando árboles dinámicos , aunque en la práctica es menos eficiente. [2]
El algoritmo push-reetiquetado se ha ampliado para calcular los flujos de costos mínimos . [5] La idea de las etiquetas de distancia ha llevado a un algoritmo de ruta de aumento más eficiente, que a su vez puede incorporarse nuevamente al algoritmo push-reetiquetado para crear una variante con un rendimiento empírico aún mayor.

Historia editar ]

El concepto de preflujo fue diseñado originalmente por Alexander V. Karzanov y se publicó en 1974 en Soviet Mathematical Dokladi 15. Este algoritmo de flujo previo también usaba una operación de empuje; sin embargo, usó distancias en la red auxiliar para determinar dónde empujar el flujo en lugar de un sistema de etiquetado. [2] [7]
El algoritmo push-relabel fue diseñado por Andrew V. Goldberg y Robert Tarjan . El algoritmo se presentó inicialmente en noviembre de 1986 en STOC '86: Actas del decimoctavo simposio anual de la ACM sobre Teoría de la computación, y luego oficialmente en octubre de 1988 como un artículo en el Journal of the ACM. Ambos documentos detallan una forma genérica del algoritmo que termina en O (  2 E ) junto con una implementación secuencial O (  3 ) , una O ( registro de VE (  2 / E ))Implementación utilizando árboles dinámicos, e implementación paralela / distribuida. [2] [8] . Una explicación en [9] Goldberg-Tarjan introdujo las etiquetas de distancia incorporándolas en el algoritmo de flujo máximo paralelo de Yossi Shiloach y Uzi Vishkin [10] .

Conceptos editar ]

Definiciones y notaciones editar ]

Dejar:
  • G = ( V , E ) sea ​​una red con función de capacidad c : V × V → ℝ  ,
  • F = ( G , c , s , t ) una red de flujo , donde s ∈ V y t ∈ V son losvértices fuente y sumideroelegidosrespectivamente,
  • f  : V × V → ℝ denota un flujo previo en F ,
  • f  : V → ℝ denota lafunción de exceso con respecto al flujo f , definido porf ( u ) = ∑ v ∈ V f ( v , u ) - ∑ v ∈ V f ( u , v ) ,
  • f  : V × V → ℝ  denota la función de capacidad residual con respecto al flujo f , definido porf  ( e ) = c ( e ) - f  ( e ) ,
y
  • f ( V , f  ) denota la red residual de G con respecto al flujo f .

El algoritmo push-reetiquetado utiliza una función de etiquetado válido de entero no negativo que utiliza etiquetas de distancia , o alturas , en nodos para determinar qué arcos deben seleccionarse para la operación push. Esta función de etiquetado se denota por 𝓁: V → ℕ . Esta función debe cumplir las siguientes condiciones para ser considerada válida:
Etiquetado válido :
𝓁 ( u ) ≤ 𝓁 ( v ) + 1 para todos u , v ) ∈ f
Condición de la fuente :
𝓁 ( s ) = | V  |
Conservación del sumidero :
𝓁 ( t ) = 0
En el algoritmo, los valores de etiqueta de s y t son fijos. 𝓁 ( u ) es un límite inferior de la distancia no ponderada de u a t en f   si t es accesible desde u . Si u ha sido desconectado de t , entonces 𝓁 ( u ) - | V  | es un límite inferior de la distancia no ponderada de u a s . Como resultado, si existe una función de etiquetado válida, no hay rutas s - t en Gf   porque no hay caminos que puedan ser más largos queV  | - 1.
Un arco u , v ) ∈ f   se llama admisible si 𝓁 ( u ) = 𝓁 ( v ) + 1 . La red admisible f ( V , f  ) se compone del conjunto de arcos e ∈ f   que son admisibles. La red admisible es acíclica.

Operaciones editar ]

Inicialización editar ]

El algoritmo comienza creando un gráfico residual, inicializando los valores de preflujo a cero y realizando un conjunto de operaciones de saturación de empuje en arcos residuales que salen de la fuente, s , v ) donde v ∈ V \ { s } . De manera similar, las etiquetas se inicializan de tal manera que la etiqueta en la fuente es el número de nodos en el gráfico, 𝓁 ( s ) = | V  | , y todos los demás nodos reciben una etiqueta de cero. Una vez que se completa la inicialización, el algoritmo realiza repetidamente las operaciones de inserción o de reetiquetado contra los nodos activos hasta que no se pueda realizar ninguna operación aplicable.

Pulse editar ]

La operación de inserción se aplica en un arco de salida admisible u , v ) de un nodo activo u en f . Mueve las unidades de flujo mín { f ( u ), f ( u , v )} de u a v .
empujar (u, v):
    afirmar x f [u]> 0 y 𝓁 [u] == 𝓁 [v] + 1
    Δ = min (x f [u], c [u] [v] - f [u] [v])
    f [u] [v] + = Δ
    f [v] [u] - = Δ
    x f [u] - = Δ
    x f [v] + = Δ
Una operación de empuje que hace que f  ( u , v ) alcance a c ( u , v ) se denomina empuje de saturación, ya que consume toda la capacidad disponible del arco residual. De lo contrario, todo el exceso en el nodo se empuja a través del arco residual. Esto se llama un empuje insaturante o no saturante .

Reetiquetar editar ]

La operación de reetiquetado se aplica en un nodo activo u sin ningún tipo de arcos admisibles en f . Modifica 𝓁 ( u ) para que sea el valor mínimo, de manera que se cree un arco exterior admisible. Tenga en cuenta que esto siempre aumenta 𝓁 ( u ) y nunca crea un arco pronunciado, que es un arco u , v ) tal que f  ( u , v )> 0 , y 𝓁 ( u )> 𝓁 ( v ) + 1 .
reetiquetar (u):
    afirmar x f [u]> 0 y 𝓁 [u] <= 𝓁 [v] para todos v tales que c [u] [v] - f [u] [v]> 0
    𝓁 [u] = min (𝓁 [v] para todo v tal que c [u] [v] - f [u] [v]> 0) + 1

Efectos de empuje y reetiquetar editar ]

Después de una operación de empujar o volver a etiquetar, 𝓁 sigue siendo una función de etiquetado válida con respecto a f .
Para una operación de empuje en un arco admisible u , v ) , puede agregar un arco v , u ) a f , donde 𝓁 ( v ) = 𝓁 ( u ) - 1 ≤ 𝓁 ( u ) + 1 ; también puede eliminar el arco u , v ) de f , donde elimina efectivamente la restricción 𝓁 ( u ) ≤ 𝓁 ( v ) + 1 .
Para ver que una operación de reetiquetado en el nodo u conserva la validez de 𝓁 ( u ) , observe que esto está garantizado trivialmente por definición para los arcos de salida de u en f . Para los in-arcos de u en f , el aumento de 𝓁 ( u ) solo puede satisfacer las restricciones con menos fuerza, no violarlas.

El algoritmo genérico push-reetiquetar editar ]

El algoritmo genérico push-reetiquetado se usa solo como prueba de concepto y no contiene detalles de implementación sobre cómo seleccionar un nodo activo para las operaciones push y reetiquetado. Esta versión genérica del algoritmo terminará en O ( E ) .
Desde 𝓁 ( s ) = | V  | 𝓁 ( t ) = 0 , y no hay rutas más largas que V  | - 1 en f , con el fin de 𝓁 ( s ) para satisfacer la condición válida etiquetado s debe estar desconectado de t . En la inicialización, el algoritmo cumple este requisito al crear un flujo previo f que satura todos los arcos de salida de s , después de lo cual 𝓁 ( v ) = 0es trivialmente válido para todos v ∈ V \ { st } . Después de la inicialización, el algoritmo ejecuta repetidamente una operación de inserción o reetiquetado aplicable hasta que no se apliquen tales operaciones, momento en el que el flujo previo se ha convertido en un flujo máximo.
genérico-push-reetiquetar (G, c, s, t):
    cree un flujo previo f que sature todos los arcos de salida de s
    vamos a 𝓁 [s] = | V |
    vamos a 𝓁 [v] = 0 para todos v ∈ V \ {s}
    Mientras que hay una operación de empuje o reetiquetado aplicable
        ejecutar la operación

Corrección editar ]

El algoritmo mantiene la condición de que 𝓁 es un etiquetado válido durante su ejecución. Esto puede comprobarse si se examinan los efectos de las operaciones de inserción y etiquetado en la función de etiqueta . La operación de reetiquetado aumenta el valor de la etiqueta en el mínimo asociado más uno que siempre cumplirá con la restricción 𝓁 ( u ) ≤ 𝓁 ( v ) + 1 . La operación de empuje puede enviar el flujo de u a v si u ) = 𝓁 ( v ) + 1 . Esto puede agregar v , u ) a f  y puede eliminar (u , v ) de G f  . La adición de ( v , u ) af  no afectará el etiquetado válido ya que 𝓁 ( v ) = 𝓁 ( u ) - 1 . La eliminación de ( u , v ) de G f  elimina la restricción correspondiente, ya que la propiedad de etiquetado válida 𝓁 ( u ) ≤ 𝓁 ( v ) + 1 solo se aplica a los arcos residuales en G f  . [8]
Si existe un preflujo fy un etiquetado válido 𝓁 para f , entonces no hay un camino de aumento de s a t en el gráfico residual f  . Esto puede comprobarse mediante una contradicción basada en las desigualdades que surgen en la función de etiquetado cuando se supone que existe un camino de aumento. Si el algoritmo termina, entonces todos los nodos en V \ { s , t } no están activos. Esto significa que todos los v ∈ V \ { s , t } no tienen exceso de flujo, y sin exceso el preflujo fobedece a la restricción de conservación del flujo y puede considerarse un flujo normal. Este flujo es el flujo máximo de acuerdo con el teorema de corte mínimo de flujo máximo, ya que no hay una ruta de aumento desde s hasta t . [8]
Por lo tanto, el algoritmo devolverá el flujo máximo al terminar.

Complejidad temporal editar ]

Para limitar la complejidad del tiempo del algoritmo, debemos analizar el número de operaciones de inserción y de reetiquetado que ocurren dentro del bucle principal. Los números de reetiquetado, saturación de empuje y no saturación de las operaciones de empuje se analizan por separado.
En el algoritmo, la operación de reetiquetado se puede realizar a lo sumo (2 |  V  | - 1) (|  V  | - 2) <2 font="" nbsp="">V  | 2veces Esto se debe a que el valor de etiquetado 𝓁 ( u ) para cualquier nodo u nunca puede disminuir, y el valor máximo de la etiqueta es a lo sumo 2 | V  | - 1 para todos los nodos. Esto significa que la operación de reetiquetado podría realizarse potencialmente 2 | V  | - 1 vez para todos los nodos V \ { s , t } (es decir, |  V  | - 2). Esto resulta en un límite deO (  2 ) para la operación de reetiquetado.
Cada pulsación de saturación en un arco admisible u , v ) elimina el arco de f  . Para que el arco se vuelva a insertar en f  para otro empuje de saturación, v primero debe volver a etiquetarse, seguido de un empuje en el arco v , u ) , y luego se debe volver a etiquetar u . En el proceso, 𝓁 ( u ) aumenta en al menos dos. Por lo tanto, hay pulsaciones de saturación de O ( V ) en u , v ), y el número total de empujes de saturación es como máximo 2 | V  || E  | Esto da como resultado un límite de tiempo de O ( VE ) para las operaciones de empuje de saturación.
El límite del número de empujes no saturantes se puede lograr a través de un argumento potencial . Utilizamos la función potencial Φ = ∑ u ∈ V ∧ f  ( u )> 0] 𝓁 ( u ) (es decir, Φ es la suma de las etiquetas de todos los nodos activos). Es obvio que Φ es 0 inicialmente y permanece no negativo durante la ejecución del algoritmo. Ambos etiqueta de nuevo y empuja saturando pueden aumentar Φ . Sin embargo, el valor de Φdebe ser igual a 0 en la terminación ya que no puede haber ningún nodo activo al final de la ejecución del algoritmo. Esto significa que durante la ejecución del algoritmo, los empujes no saturantes deben compensar la diferencia de las operaciones de etiquetado y saturación para que Φ termine con un valor de 0.
La operación de reetiquetado puede aumentar Φ como máximo (2 |  V  | - 1) (|  V  | - 2) . Una pulsación de saturación en u , v ) activa v si estaba inactiva antes de la pulsación, aumentando Φ como máximo 2 | V  | - 1 . Por lo tanto, la contribución total de todas las operaciones de saturación de empuje a Φ es como máximo (2 |  V  | - 1) (2 |  V  ||  E  |) . Un impulso no saturante u , v ) siempre se desactiva.u , pero también puede activar v como en un impulso de saturación. Como resultado, disminuye Φ al menos 𝓁 ( u ) - 𝓁 ( v ) = 1 . Desde etiqueta de nuevo y empuja saturando aumentan Φ , el número total de pulsaciones nonsaturating debe compensar la diferencia de (2 |  V  | - 1) (|  V  | - 2) + (2 |  V  | - 1) (2 |  V  ||  E  |) ≤ 4 | V  | 2 | E  | Esto resulta en un límite de tiempo de O (  2 E ) Para las operaciones de empuje no saturantes.
En resumen, el algoritmo ejecuta las reclasificaciones O (  2 ) , las pulsaciones de saturación O ( VE ) y las pulsaciones no saturantes O (  2 E ) . Las estructuras de datos se pueden diseñar para seleccionar y ejecutar una operación aplicable en O (1) tiempo. Por lo tanto, la complejidad del tiempo del algoritmo es O (  2 E ) . [1] [8]

Ejemplo editar ]

La siguiente es una ejecución de muestra del algoritmo genérico de cambio de marca, como se definió anteriormente, en el siguiente diagrama de flujo de red simple.
Gráfico de red de flujo inicial
Gráfico de red de flujo inicial
Gráfico de red de flujo máximo final
Gráfico de red de flujo máximo final
En el ejemplo, los valores h y e denotan la etiqueta 𝓁 y el exceso f  , respectivamente, del nodo durante la ejecución del algoritmo. Cada gráfico residual en el ejemplo solo contiene los arcos residuales con una capacidad mayor que cero. Cada gráfico residual puede contener múltiples iteraciones del bucle de operación de ejecución .
Operación (s) de algoritmoGrafica residual
Inicialice el gráfico residual estableciendo el preflujo en los valores 0 e inicializando el etiquetado.Paso 1
El empuje inicial de saturación se realiza en todos los arcos de preflujo fuera de la fuente, s .Paso 2
El nodo a se vuelve a etiquetar para empujar su exceso de flujo hacia el fregadero, t .
El exceso en a se empuja entonces a b, luego d en dos empujes de saturación subsiguientes; Lo que todavía deja un poco de exceso.
Paso 3
Una vez más, a se vuelve a etiquetar para empujar su exceso a lo largo de su último residuo positivo restante (es decir, empujar el exceso de nuevo a s ).
El nodo a se elimina del conjunto de nodos activos.
Etapa 4
Vuelva a etiquetar b y luego empuje su exceso haciat y c .Paso 5
Vuelva a etiquetar c y luego empuje su exceso haciad .Paso 6
Vuelva a etiquetar d y luego empuje su exceso a t .Paso 7
Esto deja al nodo b como el único nodo activo restante, pero no puede empujar su exceso de flujo hacia el sumidero.
Vuelva a etiquetar b y luego empuje su exceso hacia la fuente, s , a través del nodo a .
Paso 8
Empuje el último bit de exceso en una vuelta a la fuente, s .
No quedan nodos activos. El algoritmo finaliza y devuelve el flujo máximo del gráfico (como se ve arriba).
Paso 9
El ejemplo (pero con un flujo inicial de 0) se puede ejecutar aquí de forma interactiva.

No hay comentarios:

Publicar un comentario