Aleph-w  1.9
General library for algorithms and data structures
Redes de Flujo.
+ Collaboration diagram for Redes de Flujo.:

Classes

class  Aleph::Simplex< T >
 
struct  Aleph::Net_Arc< Arc_Info, F_Type >
 
struct  Aleph::Net_Filt< Net >
 
struct  Aleph::Net_Graph< NodeT, ArcT >
 
class  Aleph::Find_Aumenting_Path< Net, Q >
 
struct  Aleph::Ford_Fulkerson_Maximum_Flow< Net >
 
struct  Aleph::Edmonds_Karp_Maximum_Flow< Net >
 
struct  Aleph::Fifo_Preflow_Maximum_Flow< Net >
 
struct  Aleph::Heap_Preflow_Maximum_Flow< Net >
 
struct  Aleph::Random_Preflow_Maximum_Flow< Net >
 
struct  Aleph::Min_Cut< Net, Maxflow >
 
class  Aleph::Net_Sup_Dem_Node< Node_Info, F_Type >
 
class  Aleph::Net_Sup_Dem_Graph< NodeT, ArcT >
 
class  Aleph::Net_Cap_Node< Node_Info, F_Type >
 
class  Aleph::Net_Cap_Graph< NodeT, ArcT >
 
struct  Aleph::Net_Cost_Arc< Arc_Info, F_Type >
 
struct  Aleph::Net_Cost_Graph< NodeT, ArcT >
 

Typedefs

template<class Net >
using Aleph::Parc = tuple< typename Net::Arc *, bool >
 
template<class Net >
using Aleph::SemiPath = tuple< bool, typename Net::Flow_Type, DynList< Parc< Net > >>
 

Functions

template<class Net >
Net::Flow_Type Aleph::remaining_flow (typename Net::Node *src, typename Net::Arc *a) noexcept
 
template<class Net >
Net::Flow_Type Aleph::increase_flow (Net &net, const Path< Net > &path)
 
template<class Net >
void Aleph::increase_flow (Net &net, const DynList< Parc< Net >> &semi_path, const typename Net::Flow_Type slack)
 
template<class Net >
void Aleph::decrease_flow (Net &net, const DynList< Parc< Net >> &semi_path, typename Net::Flow_Type slack)
 
template<class Net , template< typename T > class Q>
Path< Net > Aleph::find_aumenting_path (const Net &net, const typename Net::Flow_Type &min_slack)
 
template<class Net >
Path< Net > Aleph::find_aumenting_path_dfs (const Net &net, const typename Net::Flow_Type &min_slack)
 
template<class Net >
Path< Net > Aleph::find_aumenting_path_bfs (const Net &net, const typename Net::Flow_Type &min_slack)
 
template<class Net , template< typename T > class Q>
SemiPath< Net > Aleph::find_aumenting_semi_path (const Net &net, const typename Net::Flow_Type &slack)
 
template<class Net >
SemiPath< Net > Aleph::find_aumenting_semi_path_dfs (const Net &net, const typename Net::Flow_Type &slack)
 
template<class Net >
SemiPath< Net > Aleph::find_aumenting_semi_path_bfs (const Net &net, const typename Net::Flow_Type &slack)
 
template<class Net , template< typename T > class Q>
SemiPath< Net > Aleph::find_decrementing_path (const Net &net, const typename Net::Flow_Type &slack)
 
template<class Net >
SemiPath< Net > Aleph::find_decrementing_path_dfs (const Net &net, const typename Net::Flow_Type &slack)
 
template<class Net >
SemiPath< Net > Aleph::find_decrementing_path_bfs (const Net &net, const typename Net::Flow_Type &slack)
 
template<class Net , template< class > class Find_Path>
Net::Flow_Type Aleph::aumenting_path_maximum_flow (Net &net)
 
template<class Net >
Net::Flow_Type Aleph::ford_fulkerson_maximum_flow (Net &net)
 
template<class Net >
Net::Flow_Type Aleph::edmonds_karp_maximum_flow (Net &net)
 
template<class Net , class Q_Type >
Net::Flow_Type Aleph::generic_preflow_vertex_push_maximum_flow (Net &net)
 
template<class Net >
Net::Flow_Type Aleph::fifo_preflow_maximum_flow (Net &net)
 
template<class Net >
Net::Flow_Type Aleph::heap_preflow_maximum_flow (Net &net)
 
template<class Net >
Net::Flow_Type Aleph::random_preflow_maximum_flow (Net &net)
 
template<class Net , template< class > class Maxflow>
Net::Flow_Type Aleph::min_cut (Net &net, DynSetTree< typename Net::Node *> &vs, DynSetTree< typename Net::Node *> &vt, DynList< typename Net::Arc *> &cuts, DynList< typename Net::Arc *> &cutt)
 
template<class Net , template< class > class Max_Flow_Algo = Ford_Fulkerson_Maximum_Flow>
tuple< size_t, double > Aleph::max_flow_min_cost_by_cycle_canceling (Net &net, double it_factor=0.4, size_t step=10)
 

Detailed Description

Redes de flujo

Una red de flujo es un digrafo dirigido que abstrae una red de tuberías por donde circula un fluido. Los arcos representan tuberías; los nodos las junturas. Cada arco asocia dos valores numéricos: asociados a cada arco:

  1. Capacidad: Máximo valor de flujo que puede circular por el arco.
  2. Valor de flujo: Valor actual del flujo que circula por el arco.

A una red de flujo también se le conoce como red capacitada. En una red capacitada se identifican nodos especiales denominados "fuentes" y "sumideros", respectivamente. Un nodo fuente es uno que no tiene arcos de entrada; consecuentemente, sólo emana flujo. Análogamente, un nodo sumidero es uno que no tiene arcos de salida; en el mismo sentido, sólo recibe flujo.

Puesto que las abstracciones provienen de la teoría física, para cada nodo que no sea fuente o sumidero siempre se debe cumplir que la cantidad total de flujo de entrada debe ser la misma que la de salida.

Las redes capacitadas son un excelente vehículo de resolución de problemas sobre grafos. Aparte del problema del flujo máximo, representable en muchas situaciones de la vida real, una red capacitada sirve para resolver otros problemas de optimización combinatoria: caminos mínimos, emparejamientos, cortes, etc.

Typedef Documentation

◆ Parc

template<class Net >
using Aleph::Parc = typedef tuple<typename Net::Arc*, bool>

Define un arco que pertenece a un semicamino

◆ SemiPath

template<class Net >
using Aleph::SemiPath = typedef tuple<bool, typename Net::Flow_Type, DynList<Parc<Net> >>

Define un semicamino compuesto por: -. bool: dise si el camino fue o no encontrado -. Flow_Type: el valor del slack del camino -. Lista de pares arco e indicación de si es normal o reducido. true ==> normal

Function Documentation

◆ aumenting_path_maximum_flow()

template<class Net , template< class > class Find_Path>
Net::Flow_Type Aleph::aumenting_path_maximum_flow ( Net &  net)

Maximiza el flujo de la red según búsquedas de caminos de aumento.

aumenting_path_maximum_flow() recibe una red capacitada y maximiza su valor de flujo mediante búsquedas sucesivas de caminos de aumento.

El método recibe tres parámetros tipo:

  1. Net: el tipo de red cuyo flujo se desea maximizar y que debe estar derivado de Net_Graph.
  2. Find_Path: la clase de búsqueda de camino.

La red puede tener múltiples fuentes y sumideros.

Parameters
[in,out]netla red capacitada cuyo flujo se desea maximizar.
[in]sael estado del filtro de arcos
Returns
el valor de flujo maximizado de la red

◆ decrease_flow()

template<class Net >
void Aleph::decrease_flow ( Net &  net,
const DynList< Parc< Net >> &  semi_path,
typename Net::Flow_Type  slack 
)

Decrementa el flujo de una red según un camino de aumento.

decrease_flow(net, semi_path) toma el camino de aumento contenido en path y decrementa el valor de flujo de net en el eslabón mínimo (slack) del camino.

Parameters
[in]netla red capacitada por donde se desea incrementar el flujo por el camino de aumento.
[in]semi_pathsemicamino por donde se aumentará el flujo
[in]slackvalor de aumento dl camino. Debe ser menor o igual al slack mínimo del camino.
Warning
No se valida el slack
+ Here is the call graph for this function:

◆ edmonds_karp_maximum_flow()

template<class Net >
Net::Flow_Type Aleph::edmonds_karp_maximum_flow ( Net &  net)

Maximiza el flujo de la red según el algoritmo de Edmonds-Karp.

edmonds_karp_maximum_flow() recibe una red capacitada y maximiza su valor de flujo mediante el algoritmo de Edmonds-Karp.

La red puede tener múltiples fuentes y sumideros.

Parameters
[in,out]netla red capacitada cuyo flujo se desea maximizar.
[in]sael filtro de arcos
Returns
el valor de flujo maximizado de la red

◆ fifo_preflow_maximum_flow()

template<class Net >
Net::Flow_Type Aleph::fifo_preflow_maximum_flow ( Net &  net)

Flujo máximo de empuje de preflujo con cola FIFO de nodos.

fifo_preflow_vertex_push_maximum_flow(net) calcula el flujo máximo de la red net según el algoritmo genérico de Goldberg y Tarjan en donde los nodos activos, aquellos cuyo flujo de entrada es mayor que el de salida son almacenados y procesados según una cola FIFO. Este algoritmo procesa empuja el preflujo por los arcos según una heurística en profundidad.

Durante la ejecución del algoritmo se emplean los contadores y cookies de todos los nodos de la red. El bit Maximum_Flow es usado para los arcos.

Parameters
[in,out]netuna red capacitada a maximizar su flujo. net puede tener varios fuentes y sumideros.
[in]leave_residualindica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, así como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos.
Returns
el valor de flujo maximizado de la red
Exceptions
bad_allocsi no hay suficiente memoria.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ find_aumenting_path()

template<class Net , template< typename T > class Q>
Path<Net> Aleph::find_aumenting_path ( const Net &  net,
const typename Net::Flow_Type &  min_slack 
)

Encuentra un camino de aumento mediante una búsqueda en profundidad o en amplitud según sea el valor del parámetro plantilla Q. Q puede ser una pila, en cuyo caso la búsqueda será en profundidad, o una cola, en cuyo caso la búsqueda será en amplitud

Parameters
[in]netred capacitada de flujo
[in]min_slackvalor mínimo de decremento del camino
[in]savalor del filtro de arcos

◆ find_aumenting_path_bfs()

template<class Net >
Path<Net> Aleph::find_aumenting_path_bfs ( const Net &  net,
const typename Net::Flow_Type &  min_slack 
)

Encuentra un camino de aumento mediante una búsqueda en amplitud.

Parameters
[in]netred capacitada de flujo
[in]min_slackvalor mínimo de aumento del camino
[in]savalor del filtro de arcos

◆ find_aumenting_path_dfs()

template<class Net >
Path<Net> Aleph::find_aumenting_path_dfs ( const Net &  net,
const typename Net::Flow_Type &  min_slack 
)

Encuentra un camino de aumento mediante una búsqueda en profundidad.

Parameters
[in]netred capacitada de flujo
[in]min_slackvalor mínimo de aumento del camino
[in]savalor del filtro de arcos

◆ find_aumenting_semi_path()

template<class Net , template< typename T > class Q>
SemiPath<Net> Aleph::find_aumenting_semi_path ( const Net &  net,
const typename Net::Flow_Type &  slack 
)

Encuentra un camino de aumento en forma de semicamino mediante una búsqueda en profundidad o en amplitud según sea el valor del parámetro plantilla Q. Q puede ser una pila, en cuyo caso la búsqueda será en profundidad, o una cola, en cuyo caso la búsqueda será en amplitud

Parameters
[in]netred capacitada de flujo
[out]semi_pathlista de pares (Arc,bool) que describe el semicamino
[in]min_slackvalor mínimo de decremento del camino
[in]savalor del filtro de arcos
Returns
en slack del semicamino. Un valor igual al dado en parámetro indica que el camino fue encontrado satisfactoriamente

◆ find_aumenting_semi_path_bfs()

template<class Net >
SemiPath<Net> Aleph::find_aumenting_semi_path_bfs ( const Net &  net,
const typename Net::Flow_Type &  slack 
)

Encuentra un camino de aumento en forma de semicamino mediante una búsqueda en amplitud.

Parameters
[in]netred capacitada de flujo
[out]semi_pathlista de pares (Arc,bool) que describe el semicamino
[in]min_slackvalor mínimo de decremento del camino
[in]savalor del filtro de arcos
Returns
en slack del semicamino. Un valor igual al dado en parámetro indica que el camino fue encontrado satisfactoriamente

◆ find_aumenting_semi_path_dfs()

template<class Net >
SemiPath<Net> Aleph::find_aumenting_semi_path_dfs ( const Net &  net,
const typename Net::Flow_Type &  slack 
)

Encuentra un camino de aumento en forma de semicamino mediante una búsqueda en profundidad.

Parameters
[in]netred capacitada de flujo
[out]semi_pathlista de pares (Arc,bool) que describe el semicamino
[in]min_slackvalor mínimo de decremento del camino
[in]savalor del filtro de arcos
Returns
en slack del semicamino. Un valor igual al dado en parámetro indica que el camino fue encontrado satisfactoriamente

◆ find_decrementing_path()

template<class Net , template< typename T > class Q>
SemiPath<Net> Aleph::find_decrementing_path ( const Net &  net,
const typename Net::Flow_Type &  slack 
)

Encuentra un camino de decremento mediante una búsqueda en profundidad o en amplitud según sea el valor del parámetro plantilla Q. Q puede ser una pila, en cuyo caso la búsqueda será en profundidad, o una cola, en cuyo caso la búsqueda será en amplitud

Parameters
[in]netred capacitada de flujo
[in]min_slackvalor mínimo de decremento del camino
[out]semi_pathlista de pares arco,forward que caracteriza el semi-camino
[in]savalor del filtro de arcos
Returns
el valor del slack. Si es igual al solicitado, entonces el semi-camino fue encontrado

◆ find_decrementing_path_bfs()

template<class Net >
SemiPath<Net> Aleph::find_decrementing_path_bfs ( const Net &  net,
const typename Net::Flow_Type &  slack 
)

Encuentra un camino de aumento mediante una búsqueda en amplitud.

Parameters
[in]netred capacitada de flujo
[in]min_slackvalor mínimo de aumento del camino
[in]savalor del filtro de arcos
+ Here is the call graph for this function:

◆ find_decrementing_path_dfs()

template<class Net >
SemiPath<Net> Aleph::find_decrementing_path_dfs ( const Net &  net,
const typename Net::Flow_Type &  slack 
)

Encuentra un camino de aumento mediante una búsqueda en amplitud.

Parameters
[in]netred capacitada de flujo
[in]min_slackvalor mínimo de aumento del camino
[in]savalor del filtro de arcos

◆ ford_fulkerson_maximum_flow()

template<class Net >
Net::Flow_Type Aleph::ford_fulkerson_maximum_flow ( Net &  net)

Maximiza el flujo de la red según el algoritmo de Ford-Fulkerson.

ford_fulkerson_maximum_flow() recibe una red capacitada y maximiza su valor de flujo mediante el algoritmo de Ford-Fulkerson.

La red puede tener múltiples fuentes y sumideros.

Durante el cálculo se construye una red residual parcial, cuyo consumo en espacio es proporcional a la cantidad de arcos.

Parameters
[in,out]netla red capacitada cuyo flujo se desea maximizar.
[in]sael filtro de arcos
Returns
el valor de flujo maximizado de la red
Exceptions
bad_allocsi no hay suficiente memoria para la red residual y para los caminos de aumento internos. En este caso, el estado de la red se corresponde con el último incremento de flujo realizado antes de que ocurra excepción.
domain_errorsi la red residual ya ha sido calculada.
+ Here is the caller graph for this function:

◆ generic_preflow_vertex_push_maximum_flow()

template<class Net , class Q_Type >
Net::Flow_Type Aleph::generic_preflow_vertex_push_maximum_flow ( Net &  net)

Flujo máximo según algoritmo genérico de empuje de preflujo orientado hacia nodos.

generic_preflow_vertex_push_maximum_flow(net) calcula el flujo máximo de la red net según el algoritmo genérico de Goldberg y Tarjan. La función emplea dos parámetros tipo:

  1. Net: una clase de red capacitada derivada del tipo Net_Graph.
  2. Q_Type: una clase conjunto de "nodos activos". Q_Type debe manejar punteros de tipo typename Net::Node y debe soportar las siguientes operaciones:
    1. get(): extracción de un nodo.
    2. put(p): inserción del nodo p en el conjunto.

Durante la ejecución del algoritmo se emplean los contadores y cookies de todos los nodos de la red. El bit Maximum_Flow es usado para los arcos.

Parameters
[in,out]netuna red capacitada a maximizar su flujo. net puede tener varios fuentes y sumideros.
[in]leave_residualindica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, así como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos.
Returns
el valor de flujo maximizado de la red
Exceptions
bad_allocsi no hay suficiente memoria.
domain_errorsi la red residual ya está calculada.
See also
fifo_preflow_maximum_flow() heap_preflow_maximum_flow() random_preflow_maximum_flow()
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ heap_preflow_maximum_flow()

template<class Net >
Net::Flow_Type Aleph::heap_preflow_maximum_flow ( Net &  net)

Flujo máximo de empuje de preflujo con cola de prioridad según la altura de los nodos.

heap_preflow_vertex_push_maximum_flow(net) calcula el flujo máximo de la red net en donde los nodos activos, aquellos cuyo flujo de entrada es mayor que el de salida son almacenados en una cola de prioridad. El preflujo se empuja desde el fuente hasta el sumidero según una heurística en amplitud.

heap_preflow_vertex_push_maximum_flow() es uno de los mejores algoritmos generales de cálculo de flujo máximo. Su desempeño para el peor caso es de $O(V^3)$.

Durante la ejecución del algoritmo se emplean los contadores y cookies de todos los nodos de la red. El bit Maximum_Flow es usado para los arcos.

Parameters
[in,out]netuna red capacitada a maximizar su flujo. net puede tener varios fuentes y sumideros.
[in]leave_residualindica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, así como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos.
Returns
el valor de flujo maximizado de la red
Exceptions
bad_allocsi no hay suficiente memoria.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ increase_flow() [1/2]

template<class Net >
Net::Flow_Type Aleph::increase_flow ( Net &  net,
const Path< Net > &  path 
)

Incrementa el flujo de una red según un camino de aumento.

increase_flow(net, path) toma el camino de aumento contenido en path e incrementa el valor de flujo de net en el eslabón mínimo (slack) del camino.

La biblioteca permite calcular caminos de aumento sobre la red residual de dos maneras:

  1. find_path_depth_first<Net, Res_F<Net> >(net, source, sink, path)
  2. find_path_breadth_first<Net, Res_F<Net> >(net, source, sink, path)

Para que tenga sentido cualquiera de estas maneras de encontrar caminos de aumento, la red residual sobre net debe estar instanciada. Pare ello, debe haberse llamado previamente a make_residual_net().

Parameters
[in]netla red capacitada por donde se desea incrementar el flujo por el camino de aumento.
[in]pathel camino de tipo Path donde se quiere almacenar el camino de aumento.
Returns
el valor en que ha sido aumentado el flujo.
See also
Path find_path_depth_first() find_path_breadth_first() make_residual_net()
Exceptions
domain_errorsi la red residual no ha sido creada
+ Here is the call graph for this function:

◆ increase_flow() [2/2]

template<class Net >
void Aleph::increase_flow ( Net &  net,
const DynList< Parc< Net >> &  semi_path,
const typename Net::Flow_Type  slack 
)

Incrementa el flujo de una red según un camino de aumento.

increase_flow(net, semi_path) toma el camino de aumento contenido en path e incrementa el valor de flujo de net en el eslabón mínimo (slack) del camino.

Parameters
[in]netla red capacitada por donde se desea incrementar el flujo por el camino de aumento.
[in]semi_pathsemicamino por donde se aumentará el flujo
[in]slackvalor de aumento dl camino. Debe ser menor o igual al slack mínimo del camino.
Warning
No se valida el slack
+ Here is the caller graph for this function:

◆ max_flow_min_cost_by_cycle_canceling()

template<class Net , template< class > class Max_Flow_Algo = Ford_Fulkerson_Maximum_Flow>
tuple<size_t, double> Aleph::max_flow_min_cost_by_cycle_canceling ( Net &  net,
double  it_factor = 0.4,
size_t  step = 10 
)

Calcula el flujo máximo a coste mínimo mediante la técnica de cancelación de ciclos.

Esta primitiva emplea el típico algoritmo de cancelación de ciclos para calcular el flujo máximo a coste mínimo de una red capacitada de flujo.

Primero, la rutina calcula un flujo máximo mediante un algoritmo de maximización de flujo. El algoritmo es un parámetro tipo, llamado Max_Flow_Algo, instanciado sobre una red de tipo genérico Net. Una vez calculado un flujo máximo inicial, el algoritmo busca ciclos negativos sobre la red residual mediante el algoritmo de Bellman-Ford. Por cada ciclo negativo encontrado, se cancela el ciclo por aumento del flujo por el ciclo y así se elimina.

El procedimiento anterior se repite hasta que ya no se encuentren más ciclos negativos. Momento en el cual el flujo es máximo y el coste mínimo.

Parameters
[in]netla red a maximizar flujo y minimizar coste.
[in]it_factorfactor de iteraciones en el cual el algoritmo de Bellman-Ford comenzará a buscar ciclos negativos
Exceptions
bad_allocsi no hay suficiente memoria.
Returns
Una dupla con la cantidad de ciclos encontrados y el factor final de iteraciones
+ Here is the call graph for this function:

◆ min_cut()

template<class Net , template< class > class Maxflow>
Net::Flow_Type Aleph::min_cut ( Net &  net,
DynSetTree< typename Net::Node *> &  vs,
DynSetTree< typename Net::Node *> &  vt,
DynList< typename Net::Arc *> &  cuts,
DynList< typename Net::Arc *> &  cutt 
)

Calcula el flujo máximo de una red capacitada y determina el corte mínimo.

min_cut() recibe una red capacitada cuyo flujo es maximizado y luego, a partir del flujo máximo, se calcula el corte mínimo. La rutina recibe dos parámetros tipo:

  1. Net: la clase de red, la cual debe ser derivada de la clase Net_Graph.
  2. Maxflow: la clase del algoritmo de cálculo de flujo máximo que se desea emplear.
Parameters
[in,out]netla red a maximizar el flujo y de la cual se desea calcular un corte mínimo
[out]vsel conjunto de nodos $V_s$.
[out]vtel conjunto de nodos $V_t$.
[out]cutsel conjunto de arcos que van de $V_s$ hacia $V_t$. Este es el corte.
[out]cuttel conjunto de arcos que van de $V_t$ hacia $V_s$.
leave_residualleave_residual indica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, así como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos.
Returns
el valor del flujo maximizado (que es igual a la capacidad del corte mínimo)
See also
Edmonds_Karp_Maximum_Flow Random_First_Preflow_Maximum_Flow Priority_First_Preflow_Maximum_Flow Breadth_First_Preflow_Maximum_Flow Depth_First_Preflow_Maximum_Flow Random_Preflow_Maximum_Flow Heap_Preflow_Maximum_Flow Fifo_Preflow_Maximum_Flow Ford_Fulkerson_Maximum_Flow
+ Here is the call graph for this function:

◆ random_preflow_maximum_flow()

template<class Net >
Net::Flow_Type Aleph::random_preflow_maximum_flow ( Net &  net)

Flujo máximo de empuje de preflujo con cola aleatoria de nodos activos.

random_preflow_vertex_push_maximum_flow(net) calcula el flujo máximo de la red net en donde los nodos activos, aquellos cuyo flujo de entrada es mayor que el de salida son almacenados en una cola aleatoria.

Durante la ejecución del algoritmo se emplean los contadores y cookies de todos los nodos de la red. El bit Maximum_Flow es usado para los arcos.

Parameters
[in,out]netuna red capacitada a maximizar su flujo. net puede tener varios fuentes y sumideros.
[in]leave_residualindica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, así como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos.
Returns
el valor de flujo maximizado de la red
Exceptions
bad_allocsi no hay suficiente memoria.
+ Here is the caller graph for this function:

◆ remaining_flow()

template<class Net >
Net::Flow_Type Aleph::remaining_flow ( typename Net::Node *  src,
typename Net::Arc *  a 
)
noexcept

Retorna el flujo restante según que a respecto al nodo p sea o no un arco residual.


Leandro Rabindranath León