¿El método codicioso garantiza el flujo máximo en un árbol dirigido?

Considere un árbol dirigido GRAMO con un nodo raíz s . Dejar s ser el nodo fuente de GRAMO y sus hojas son los nodos sumideros (llame a estas hojas t ). (Y, por supuesto, los bordes tienen sus respectivas capacidades como cualquier problema de flujo de red).

Notaciones utilizadas

s - fuente
t - hundir
F ( mi ) - flujo en el borde mi
C ( mi ) - capacidad en el borde mi
v ( F ) - valor del flujo

Algoritmo codicioso

  • Empezar con F ( mi ) = 0 para todos los bordes en GRAMO .
  • Encuentra un s t camino donde para cada borde mi , F ( mi ) < C ( mi ) , y aumente el flujo a lo largo de este camino hasta que uno de los bordes de este camino alcance su capacidad. Rehacer este paso para otro s t camino donde F ( mi ) < C ( mi ) para todos los bordes en el camino. Vuelva a hacer hasta que no queden más rutas para aumentar el flujo.

Demuestre que este algoritmo codicioso calcula con éxito el flujo máximo de GRAMO , o mostrar un contraejemplo.

Intentar

Originalmente creí que este problema era falso, ya que encontré algunos ejemplos de algoritmos codiciosos que se utilizan para demostrar la incorrección. Pero después de pensarlo, me di cuenta de que me perdí un detalle crucial que lo diferencia de cualquier otro intento de flujo máximo codicioso de gráficos, ya que este es un árbol . Creo en este mismo hecho de que es un árbol: ¡no hay ciclos! – hace la diferencia para permitir que este algoritmo funcione.

La razón por la que esto funciona parece bastante obvia al principio, pero me cuesta convencerme de ello.

Al elegir una ruta arbitraria desde el nodo raíz hasta una hoja y aumentar el flujo, aunque esto puede afectar la cantidad de flujo que se puede enviar a lo largo de una ruta similar. s t ruta que comparte algunos bordes desde el nivel superior, no debería alterar el valor de flujo general enviado a los sumideros, ya que cualquier flujo que ingrese debe llegar al sumidero (hojas) (Este detalle es más aparente si miro el árbol usando su definición recursiva usando subárbol nodos). Dado que cada nodo tiene solo uno en grado, solo recibe flujo de una sola fuente, por lo que simplemente puede distribuirlo a sus hijos (si los hay) libremente sin tener que concentrarse mucho para maximizar el flujo en gráficos generales. Simplemente podemos repetir este proceso hasta que los bordes, ya sea en el nivel superior en el origen o en cualquier otro lugar de la ruta, estén llenos a su máxima capacidad.

Creo que tengo los conceptos básicos para comenzar la prueba, pero tengo problemas para formalizarla (no estoy seguro de cómo aplicar su prueba de algoritmo codicioso habitual aquí, ya que técnicamente no hay "conflicto" per se ...). Pero, de nuevo, podría estar equivocado y perderme un contraejemplo.

Cualquier entrada sería apreciada. Gracias.

Estoy de acuerdo contigo en que el algoritmo codicioso probablemente funcione, y por la razón que dices. Lo primero que se me ocurre es probar la inducción sobre el tamaño del árbol, quizás sobre la profundidad del árbol.
En un árbol, dado cualquier flujo inicial, no hay forma de que la reducción del flujo a lo largo de un arco permita aumentar el flujo total, ya que la única forma en que la reducción del flujo a lo largo de un arco A podría aumentar el flujo total es si el flujo a través de A va a un vértice en el que también va el flujo a través de otro arco, lo que requiere un ciclo.
Creo que usar el teorema de corte mínimo de flujo máximo es una forma bastante elegante de hacer esto; todo lo que tiene que hacer es probar que el algoritmo termina (fácil), luego mostrar cómo, dado el flujo final, puede construir un corte con el mismo valor (tampoco es difícil). En este tipo de gráfico también funciona un algoritmo codicioso mucho más simple (IMO); simplemente calcule el flujo máximo posible desde cada vértice en orden de altura creciente, teniendo en cuenta las capacidades de los bordes a medida que avanza.

Respuestas (1)

En primer lugar, el algoritmo termina porque al menos un borde está saturado en cada paso y hay un número finito de bordes. Ahora deja F Sea el flujo resultante, y suponga F hay un mayor flujo a través del árbol. Para F ser un flujo mayor que F , Debemos tener F ( mi ) > F ( mi ) por al menos un borde mi que se aleja de la fuente. Ahora aplique el mismo argumento a los bordes que se alejan del vértice final de mi y continúa este proceso hasta que hayas llegado a una hoja. El resultado es un camino de s a una hoja en la que cada borde tiene mayor flujo en F que en F . Así que este es un camino a lo largo del cual el algoritmo podría haber aumentado F . La contradicción muestra que no existe tal flujo. F , y entonces F es máximo.