#include <tpl_netgraph.H>
Tipos públicos | |
typedef Array_Digraph< NodeT, ArcT > | Digraph |
typedef ArcT | Arc |
Tipo de arco. | |
typedef NodeT | Node |
Tipo de node. | |
typedef Arc::Flow_Type | Flow_Type |
Tipo que representa la capacidad y el flujo. | |
typedef Node::Node_Type | Node_Type |
Tipo de atributo que almacena un nodo. | |
typedef Arc::Arc_Type | Arc_Type |
Tipo de atributo que almacena un arco. | |
Tipos públicos heredados desde Aleph::Array_Digraph< NodeT, ArcT > | |
typedef NodeT | Node |
typedef ArcT | Arc |
Métodos públicos | |
Flow_Type | get_in_cap (Node *node) const |
Retorna la capacidad total de entrada del nodo node. | |
Flow_Type | get_out_cap (Node *node) const |
Retorna la capacidad total de salida del nodo node. | |
size_t | get_in_degree (Node *node) const |
size_t | get_out_degree (Node *node) const |
Flow_Type | get_out_flow (Node *node) const |
Retorna el valor de flujo de salida del nodo. | |
Flow_Type | get_in_flow (Node *node) const |
Retorna el valor de flujo de entrada del nodo. | |
bool | is_source (Node *node) |
Retorna true si node es fuente. | |
bool | is_sink (Node *node) |
Retorna true si node es sumidero. | |
bool | is_connected (Node *node) const |
bool | check_node (Node *node) |
Aleph::set< Node * > & | get_src_nodes () |
Retorna el conjunto de nodos fuente que contiene la red. | |
Aleph::set< Node * > & | get_sink_nodes () |
Retorna el conjunto de nodos sumidero que contiene la red. | |
void | make_super_source () |
void | unmake_super_source () |
void | make_super_sink () |
void | unmake_super_sink () |
void | make_super_nodes () |
void | unmake_super_nodes () |
Node * | get_source () |
Retorna un nodo fuente de la red. | |
Node * | get_sink () |
Retorna un nodo sumidero de la red. | |
Node * | insert_node (const Node_Type &node_info) |
Node * | insert_node () |
Node * | insert_node (Node *p) |
virtual Arc * | insert_arc (Node *src_node, Node *tgt_node, const typename Arc::Arc_Type &arc_info, const Flow_Type &cap, const Flow_Type &flow) |
Arc * | connect_arc (Arc *arc) |
virtual Arc * | insert_arc (Node *src_node, Node *tgt_node, const Flow_Type &cap) |
virtual Arc * | insert_arc (Node *src_node, Node *tgt_node, const typename Arc::Arc_Type &arc_info) |
virtual Arc * | insert_arc (Node *src_node, Node *tgt_node) |
virtual void | remove_arc (Arc *arc) |
Elimina de la red el arco arc. | |
void | disconnect_arc (Arc *arc) |
virtual void | remove_node (Node *p) |
Elimina un nodo de una red de flujo junto con todos sus arcos. | |
Net_Graph (Digraph &digraph) | |
Net_Graph (Net_Graph &net) | |
void | set_cap (Arc *arc, const Flow_Type &cap) |
Coloca valor de capacidad a un arco. | |
void | set_flow (Arc *arc, const Flow_Type &flow) |
const Flow_Type & | get_flow (Arc *arc) const |
retorna el valor de capacidad del arco. | |
const Flow_Type & | get_cap (Arc *arc) const |
Retorna el valor de flujo de un arco. | |
void | reset () |
bool | check_network () |
Flow_Type | flow_value () |
void | insert_residual_arc (Arc *arc) |
void | make_residual_net () |
void | unmake_residual_net () |
bool | is_there_residual_net () const |
Retorna true si la red residual está creada; false de lo contrario. | |
Arc * | get_residual_arc (Arc *a) |
Obtiene el arco residual de a. | |
void | increase_out_flow (Node *p, const Flow_Type &flow) |
void | decrease_out_flow (Node *p, const Flow_Type &flow) |
void | increase_in_flow (Node *p, const Flow_Type &flow) |
void | decrease_in_flow (Node *p, const Flow_Type &flow) |
Métodos públicos heredados desde Aleph::Array_Digraph< NodeT, ArcT > | |
Array_Digraph (const Array_Digraph &dg) | |
Array_Digraph (Array_Digraph &&dg) | |
Array_Digraph & | operator= (const Array_Digraph< Node, Arc > &g) |
Array_Digraph & | operator= (Array_Digraph< Node, Arc > &&g) |
Métodos públicos heredados desde Aleph::Array_Graph< NodeT, ArcT > | |
virtual Node * | insert_node (Node *p) |
void | compress () |
Arc * | connect_arc (Arc *arc) |
Arc * | disconnect_arc (Arc *arc) |
virtual void | remove_arc (Arc *a) |
virtual void | remove_node (Node *p) |
Node * | get_first_node () const |
Arc * | get_first_arc () const |
Arc * | get_first_arc (Node *p) const |
Array_Graph (const Array_Graph &g) | |
Array_Graph (Array_Graph &&g) | |
void | swap (Array_Graph &g) |
Array_Graph & | operator= (const Array_Graph &g) |
Array_Graph & | operator= (Array_Graph &&g) |
void | sort_arcs (Compare &) |
void | sort_arcs (Compare &&) |
GRAPH_FUNCTIONAL_METHODS (Array_Graph) | |
Atributos públicos | |
Flow_Type | Infinity |
bool | with_super_source |
true si a la red se le ha añadido un supra fuente. | |
bool | with_super_sink |
true si a la red se le ha añadido un supra sumidero. | |
bool | residual_net |
Atributos públicos heredados desde Aleph::Array_Graph< NodeT, ArcT > | |
GRAPH_ITERATIVE_METHODS | |
GRAPH_SEARCH_METHODS | |
GRAPH_INSERTION_METHODS | |
Red de flujo implementada mediante listas de adyacencia.
El tipo Net_Graph modeliza una red capacitada, principal instrumento del cálculo de flujo máximo y vehículo de una extensa e importante familia de algoritmos sobre grafos.
La clase recibe dos parámetros tipo:
|
inline |
Constructor a partir de un digrafo. Dispara bad_alloc si no hay suficiente memoria.
Hace referencia a Aleph::copy_graph().
|
inline |
Construye una red copia de la red net. Dispara bad_alloc si no hay suficiente memoria.
Hace referencia a Aleph::copy_graph().
|
inline |
Verifica si una red capacitada satisface las condiciones de definición.
check_network() recorre todos los nodos y arcos de una red capacitada en búsqueda de inconsistencias de definición. Básicamente, se verifica que para todo nodo no fuente o no sumidero la cantidad de flujo entrante sea igual a la saliente. Por cada arco inspeccionado se verifica que el flujo sea menor o igual que su capacidad.
Hace referencia a Aleph::Net_Graph< NodeT, ArcT >::check_node() y Aleph::Filter_Iterator< Container, It, Show_Item >::next().
|
inline |
Retorna true si el nodo node satisface las condiciones de flujo; es decir, que el flujo de entrada sea igual al de salida.
Hace referencia a Aleph::Net_Arc< Arc_Info, F_Type >::cap, Aleph::Net_Graph< NodeT, ArcT >::is_connected(), Aleph::Net_Graph< NodeT, ArcT >::is_sink(), Aleph::Net_Graph< NodeT, ArcT >::is_source() y Aleph::Filter_Iterator< Container, It, Show_Item >::next().
Referenciado por Aleph::Net_Graph< NodeT, ArcT >::check_network().
|
inline |
Conecta un arco de red previamente insertado y desconectado.
Este método toma un puntero a un arco arc, previamente desconectado mediante, desconnect_arc(), y lo re-inserta en el grafo.
El arco, por supuesto, debe haber sido previamente insertado en el grafo. A este respecto, no se hace ninguna verificación.
No se realiza ninguna verificación de existencia previa de un arco entre los nodos involucrados (esto es necesario para operar con multigrafos).
[in] | arc | puntero al arco a re-insertar. |
Hace referencia a Aleph::set< T, Compare, Tree >::erase().
|
inline |
Desconecta de la red el arco arc.
La operación desconecta del grafo el arco arc. Eventualmente, el arco puede guardarse y luego reinsertarse mediante connect_arc().
El arco debe pertenecer al grafo y no se realiza ninguna verificación al respecto.
[in] | arc | puntero al arco a desconectar |
Hace referencia a Aleph::set< T, Compare, Tree >::insert().
|
inline |
Retorna el valor de flujo de la red visto desde el nodo fuente o sumidero p. Dispara excepción std::domain_error si p no es ni fuente ni sumidero.
Hace referencia a Aleph::Net_Graph< NodeT, ArcT >::get_source().
|
inline |
Retorna el grado de entrada del nodo (cantidad de arcos que inciden sobre él.
Referenciado por Aleph::Net_Sup_Dem_Graph< NodeT, ArcT >::compute_aux_net().
|
inline |
Retorna el grado de salida del nodo (cantidad de arcos que salen él.
Referenciado por Aleph::Net_Sup_Dem_Graph< NodeT, ArcT >::compute_aux_net().
|
inlinevirtual |
Inserta un arco en una red de flujo.
insert_arc() crea un nuevo arco con valor de atributo arc_info, con valor de capacidad cap y flujo flow, desde el nodo src_node hacia el nodo tgt_node.
[in] | src_node | puntero hacia el nodo origen. |
[in] | tgt_node | puntero hacia el nodo destino. |
[in] | arc_info | valor de atributo a guardar en el nuevo arco. |
[in] | cap | valor de capacidad del arco. |
[in] | flow | valor de flujo del arco. |
std::bad_alloc | si no hay suficiente memoria para crear el arco. |
std::overflow_error | si el valor de flujo es mayor que el de la capacidad. |
Hace referencia a Aleph::set< T, Compare, Tree >::erase().
Referenciado por Aleph::Net_Cap_Graph< NodeT, ArcT >::compute_aux_net(), Aleph::Net_Sup_Dem_Graph< NodeT, ArcT >::compute_aux_net(), Aleph::Net_Max_Flow_Min_Cost< NodeT, ArcT >::insert_arc(), Aleph::Net_Graph< NodeT, ArcT >::insert_arc(), Aleph::Net_Graph< NodeT, ArcT >::make_super_sink() y Aleph::Net_Graph< NodeT, ArcT >::make_super_source().
|
inlinevirtual |
Inserta un arco en una red de flujo.
insert_arc() crea un nuevo arco con valor de atributo arc_info, con valor de capacidad cap desde el nodo src_node hacia el nodo tgt_node.
El valor de flujo es cero.
[in] | src_node | puntero hacia el nodo origen. |
[in] | tgt_node | puntero hacia el nodo destino. |
[in] | cap | valor de capacidad del arco. |
std::bad_alloc | si no hay suficiente memoria para crear el arco. |
std::overflow_error | si el valor de flujo es mayor que el de la capacidad. |
Hace referencia a Aleph::Net_Graph< NodeT, ArcT >::insert_arc().
|
inlinevirtual |
Inserta un arco en una red de flujo.
insert_arc() crea un nuevo arco con valor de atributo arc_info desde el nodo src_node hacia el nodo tgt_node.
El arco se crea con valores de capacidad y flujo de cero.
[in] | src_node | puntero hacia el nodo origen. |
[in] | tgt_node | puntero hacia el nodo destino. |
[in] | arc_info | valor de atributo a guardar en el nuevo arco. |
std::bad_alloc | si no hay suficiente memoria para crear el arco. |
std::overflow_error | si el valor de flujo es mayor que el de la capacidad. |
Hace referencia a Aleph::Net_Graph< NodeT, ArcT >::insert_arc().
|
inlinevirtual |
Inserta un arco en una red de flujo.
insert_arc() crea un nuevo arco desde el nodo src_node hacia el nodo tgt_node.
La información asociada al arco es indeterminada. Por lo general este debe ser el método a emplear si los arcos de la red no almacenan información asociada.
El arco se crea con valores de capacidad y flujo de cero.
[in] | src_node | puntero hacia el nodo origen. |
[in] | tgt_node | puntero hacia el nodo destino. |
std::bad_alloc | si no hay suficiente memoria para crear el arco. |
std::overflow_error | si el valor de flujo es mayor que el de la capacidad. |
Reimplementado en Aleph::Net_Max_Flow_Min_Cost< NodeT, ArcT >.
Hace referencia a Aleph::Net_Graph< NodeT, ArcT >::insert_arc().
|
inline |
Inserta un nuevo nodo en la red.
insert_node(node_info) aparta memoria para un nodo de red, le copia la información asociada node_info e inserta el nodo en la red this.
[in] | node_info | la información a copiar en el nodo. |
bad_alloc | si no hay suficiente memoria. |
Hace referencia a Aleph::set< T, Compare, Tree >::erase() y Aleph::set< T, Compare, Tree >::insert().
Referenciado por Aleph::Net_Cap_Graph< NodeT, ArcT >::compute_aux_net().
|
inline |
Inserta un nuevo nodo en la red. El valor de información es indeterminado. Dispara bad_alloc si no hay suficiente memoria.
Hace referencia a Aleph::Net_Graph< NodeT, ArcT >::insert_node().
Referenciado por Aleph::Net_Sup_Dem_Graph< NodeT, ArcT >::compute_aux_net(), Aleph::Net_Sup_Dem_Graph< NodeT, ArcT >::insert_node(), Aleph::Net_Cap_Graph< NodeT, ArcT >::insert_node(), Aleph::Net_Graph< NodeT, ArcT >::insert_node(), Aleph::Net_Graph< NodeT, ArcT >::make_super_sink() y Aleph::Net_Graph< NodeT, ArcT >::make_super_source().
|
inline |
Inserta un nuevo nodo en la red copia de otro nodo p.
insert_node(p) aparta memoria para un nodo de red, le copia la información contenida en p e inserta el nuevo nodo en la red this.
[in] | p | otro nodo de la misma o de otra red del cual se copiará la información asociada al nodo. |
bad_alloc | si no hay suficiente memoria. |
Hace referencia a Aleph::set< T, Compare, Tree >::erase() y Aleph::set< T, Compare, Tree >::insert().
|
inline |
Retorna true si el nodo node está conectado. El propósito de este método es de validación, como parte de la verificación de que una red sea conexa.
Referenciado por Aleph::Net_Graph< NodeT, ArcT >::check_node().
|
inline |
Calcula la red residual de una red capacitada.
make_residual_net() calcula el grafo residual de una red. La red puede tener múltiples fuentes y sumideros, así como tener valores de flujo distintos de cero.
La red residual es la principal estructura de dato empleada por los algoritmos de cálculo de flujo máximo.
A diferencia de otros enfoques, en esta implantación los arcos residuales se colocan sobre la misma red. Consecuentemente, se puede decir que el método tiene un buen ahorre de memoria, pues los arcos normales y los nodos no son redundados.
Para saber si un arco es residual o no puede consultarse su atributo is_residual.
El arco reflejo puede consultarse mediante el atributo img_arc.
Para ver sólo los arcos de la red, residuales o no, puede emplearse un iterador wrapper con la clase filtro Res_F. De este modo, Node_Arc_Iterator o Arc_Iterator sólo verán arcos con capacidad disponible; es decir aquellos arcos cuya diferencia entre capacidad nominal y el valor de flujo sea diferente de cero.
También pueden verse todos los arcos, independientemente de que sean o no residuales, con un iterador interno de Net_Graph o con uno wrapper sin filtro. En este caso, es responsabilidad del usuario distinguir los arcos según el interés; que sean residuales o que tengan capacidad según sea el caso.
Los algoritmos de cálculo de flujo máximo emplean este método. Su uso está destinado para otros algoritmos no instrumentados en esta biblioteca.
domain_error | si la red residual ya está calculada. |
bad_alloc | si no hay suficiente memoria. |
Hace referencia a Aleph::Filter_Iterator< Container, It, Show_Item >::next() y Aleph::Net_Graph< NodeT, ArcT >::unmake_residual_net().
|
inline |
Convierte una red con varios nodos fuente y sumideros a una red con un solo nodo supra-fuente y uno supra-sumidero.
Hace referencia a Aleph::Net_Graph< NodeT, ArcT >::make_super_sink(), Aleph::Net_Graph< NodeT, ArcT >::make_super_source() y Aleph::Net_Graph< NodeT, ArcT >::unmake_super_source().
|
inline |
Convierte una red con varios sumideros a una red con un sólo nodo supra-sumidero. Dispara excepción si la red no contiene un nodo sumidero o si no hay suficiente memoria.
Hace referencia a Aleph::DynDlist< T >::append(), Aleph::set< T, Compare, Tree >::begin(), Aleph::set< T, Compare, Tree >::end(), Aleph::Net_Graph< NodeT, ArcT >::get_in_cap(), Aleph::Net_Graph< NodeT, ArcT >::insert_arc(), Aleph::Net_Graph< NodeT, ArcT >::insert_node(), Aleph::Dlink::is_empty(), Aleph::DynDlist< T >::remove_first(), Aleph::set< T, Compare, Tree >::size() y Aleph::Net_Graph< NodeT, ArcT >::with_super_sink.
Referenciado por Aleph::Net_Graph< NodeT, ArcT >::make_super_nodes().
|
inline |
Convierte una red con varios fuentes a una red con un sólo nodo supra-fuente. Dispara excepción si la red no contiene un nodo fuente o si no hay suficiente memoria.
Hace referencia a Aleph::DynDlist< T >::append(), Aleph::set< T, Compare, Tree >::begin(), Aleph::set< T, Compare, Tree >::end(), Aleph::Net_Graph< NodeT, ArcT >::get_out_cap(), Aleph::Net_Graph< NodeT, ArcT >::insert_arc(), Aleph::Net_Graph< NodeT, ArcT >::insert_node(), Aleph::Dlink::is_empty(), Aleph::DynDlist< T >::remove_first(), Aleph::set< T, Compare, Tree >::size() y Aleph::Net_Graph< NodeT, ArcT >::with_super_source.
Referenciado por Aleph::Net_Graph< NodeT, ArcT >::make_super_nodes().
|
inline |
Coloca valor de flujo a un arco. Dispara excepción si el valor es mayor que la capacidad.
|
inline |
Deshace una red residual previamente calculada. Dispara excepción domain_error si la red residual no ha sido previamente calculada.
Referenciado por Aleph::Net_Graph< NodeT, ArcT >::make_residual_net().
|
inline |
Restaura una red con un nodo supra-fuente y uno solo supra-sumidero a la red original con varios nodos fuentes y sumideros.
Hace referencia a Aleph::Net_Graph< NodeT, ArcT >::unmake_super_sink() y Aleph::Net_Graph< NodeT, ArcT >::unmake_super_source().
|
inline |
Restaura una red con un nodo supra-sumidero a la red original con varios nodos sumidero.
Hace referencia a Aleph::set< T, Compare, Tree >::begin(), Aleph::Net_Graph< NodeT, ArcT >::remove_node(), Aleph::set< T, Compare, Tree >::size() y Aleph::Net_Graph< NodeT, ArcT >::with_super_sink.
Referenciado por Aleph::Net_Graph< NodeT, ArcT >::unmake_super_nodes().
|
inline |
Restaura una red con un nodo supra-fuente a la red original con varios nodos fuente.
Hace referencia a Aleph::set< T, Compare, Tree >::begin(), Aleph::Net_Graph< NodeT, ArcT >::remove_node(), Aleph::set< T, Compare, Tree >::size() y Aleph::Net_Graph< NodeT, ArcT >::with_super_source.
Referenciado por Aleph::Net_Graph< NodeT, ArcT >::make_super_nodes() y Aleph::Net_Graph< NodeT, ArcT >::unmake_super_nodes().