@c English version: 2011-06-11
@menu
* Introducción a graphs::
* Funciones y variables para graphs::
@end menu

@node Introducción a graphs, Funciones y variables para graphs, graphs, graphs
@section Introducción a graphs

El paquete @code{graphs} permite trabajar con estructuras de grafos y digrafos en
Maxima. Tanto los grafos como los digrafos son de estructura simples (no 
tienen ni aristas mÃºltiples ni bucles), pero los digrafos pueden tener
una arista dirigida desde @var{u} hasta @var{v} y otra desde @var{v}
hasta @var{u}.

Los grafos se representan internamente como listas de adyacencia y se
implementan como estructuras de lisp. Los vértices se identifican 
por sus números de identificaci@'n (siempre enteros). Las aristas/arcos
se representan por listas de longitud 2. Se pueden asignar etiquetas a los
vértices de los grafos/digrafos y pesos a sus aristas/arcos.

La función @code{draw_graph} dibuja grafos siguiendo un criterio rígido
de posicionamiento de los vértices. También puede hacer uso del programa graphviz
disponible en @url{http://www.graphviz.org}. La función @code{draw_graph} utiliza el paquete 
@code{draw} de Maxima.

Para hacer uso de este paquete, ejecútese primero @code{load(graphs)}.


@node Funciones y variables para graphs, , Introducción a graphs, graphs
@section Funciones y variables para graphs

@subsection Construyendo grafos

@deffn {Función} create_graph (@var{v_list}, @var{e_list})
@deffnx {Función} create_graph (@var{n}, @var{e_list})
@deffnx {Función} create_graph (@var{v_list}, @var{e_list}, @var{directed})

Crea un nuevo grafo sobre el conjunto de vértices @var{v_list} con aristas
@var{e_list}.

@var{v_list} es una lista de vértices (@code{[v1, v2,..., vn]}) o una lista de
vértices junto con sus respectivas etiquetas (@code{[[v1,l1], [v2,l2],..., [vn,ln]]}).

@var{n} es el número de vértices, los cuales se identificarán desde
0 hasta n-1.

@var{e_list} es una lista de aristas (@code{[e1, e2,..., em]}) o una lista de
aristas con sus respectivas ponderaciones (@code{[[e1, w1], ..., [em, wm]]}).

Si @var{directed} is not @code{false}, se devolverá un grafo orientado.

Ejemplos:

Crea un ciclo de 3 vértices.

@c ===beg===
@c load (graphs)$
@c g : create_graph([1,2,3], [[1,2], [2,3], [1,3]])$
@c print_graph(g)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : create_graph([1,2,3], [[1,2], [2,3], [1,3]])$
(%i3) print_graph(g)$
Graph on 3 vertices with 3 edges.
Adjacencies:
  3 :  1  2
  2 :  3  1
  1 :  3  2
@end example

Crea un ciclo de 3 vértices y aristas ponderadas:

@c ===beg===
@c load (graphs)$
@c g : create_graph([1,2,3], [[[1,2], 1.0], [[2,3], 2.0],
@c                           [[1,3], 3.0]])$
@c print_graph(g)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : create_graph([1,2,3], [[[1,2], 1.0], [[2,3], 2.0],
                                [[1,3], 3.0]])$
(%i3) print_graph(g)$
Graph on 3 vertices with 3 edges.
Adjacencies:
  3 :  1  2
  2 :  3  1
  1 :  3  2
@end example

Crea un grafo orientado:

@c ===beg===
@c load (graphs)$
@c d : create_graph(
@c         [1,2,3,4], 
@c         [
@c          [1,3], [1,4],
@c          [2,3], [2,4]
@c         ],
@c         'directed = true)$
@c print_graph(d)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) d : create_graph(
       [1,2,3,4], 
       [
        [1,3], [1,4],
        [2,3], [2,4]
       ],
       'directed = true)$
(%i3) print_graph(d)$
Digraph on 4 vertices with 4 arcs.
Adjacencies:
  4 :
  3 :
  2 :  4  3
  1 :  4  3
@end example
@end deffn



@deffn {Función} copy_graph (@var{g})
Devuelve una copia del grafo @var{g}.
@end deffn

@deffn {Función} circulant_graph (@var{n}, @var{d})
Devuelve un grafo cirlulante de parámetros @var{n} y @var{d}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : circulant_graph(10, [1,3])$
@c print_graph(g)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : circulant_graph(10, [1,3])$
(%i3) print_graph(g)$
Graph on 10 vertices with 20 edges.
Adjacencies:
  9 :  2  6  0  8
  8 :  1  5  9  7
  7 :  0  4  8  6
  6 :  9  3  7  5
  5 :  8  2  6  4
  4 :  7  1  5  3
  3 :  6  0  4  2
  2 :  9  5  3  1
  1 :  8  4  2  0
  0 :  7  3  9  1
@end example
@end deffn

@deffn {Función} clebsch_graph ()
Devuelve el grafo de Clebsch.
@end deffn

@deffn {Función} complement_graph (@var{g})
Devuelve el complemento del grafo @var{g}.
@end deffn

@deffn {Función} complete_bipartite_graph (@var{n}, @var{m})
Devuelve el grafo bipartido completo de @var{n+m} vértices.
@end deffn

@deffn {Función} complete_graph (@var{n})
Devuelve el grafo completo de @var{n} vértices.
@end deffn

@deffn {Función} cycle_digraph (@var{n})
Devuelve el ciclo dirigido de @var{n} vértices.
@end deffn

@deffn {Función} cycle_graph (@var{n})
Devuelve el ciclo de @var{n} vértices.
@end deffn

@deffn {Función} cuboctahedron_graph (@var{n})
Devuelve el grafo cubooctaédrico.
@end deffn

@deffn {Función} cube_graph (@var{n})
Devuelve el cubo de @var{n} dimensiones.
@end deffn

@deffn {Función} dodecahedron_graph ()
Devuelve el grafo del dodecaedro.
@end deffn

@deffn {Función} empty_graph (@var{n})
Devuelve el grafo vacío de @var{n} vértices.
@end deffn

@deffn {Función} flower_snark (@var{n})
Devuelve el grafo de flor de @var{4n} vértices.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c f5 : flower_snark(5)$
@c chromatic_index(f5);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) f5 : flower_snark(5)$
(%i3) chromatic_index(f5);
(%o3)                                  4
@end example
@end deffn

@deffn {Función} from_adjacency_matrix (@var{A})
Devuelve el grafo definido por la matriz de adyacencia @var{A}.
@end deffn

@deffn {Función} frucht_graph ()
Devuelve el grafo de Frucht.
@end deffn

@deffn {Función} graph_product (@var{g1}, @var{g1})
Devuelve el producto dirigido de los grafos @var{g1} y @var{g2}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c grid : graph_product(path_graph(3), path_graph(4))$
@c draw_graph(grid)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) grid : graph_product(path_graph(3), path_graph(4))$
(%i3) draw_graph(grid)$
@end example
@end deffn

@ifhtml
@image{../figures/graphs01,6cm}
@end ifhtml

@deffn {Función} graph_union (@var{g1}, @var{g1})
Devuelve la unión (suma) de los grafos @var{g1} y @var{g2}.
@end deffn

@deffn {Función} grid_graph (@var{n}, @var{m})
Devuelve la rejilla @var{n x m}.
@end deffn

@deffn {Función} great_rhombicosidodecahedron_graph ()
Devuelve el grafo gran rombicosidodecaédrico.
@end deffn

@deffn {Función} great_rhombicuboctahedron_graph ()
Devuelve el grafo gran rombicocubicooctaédrico.
@end deffn

@deffn {Función} grotzch_graph ()
Devuelve el grafo de Grotzch.
@end deffn

@deffn {Función} heawood_graph ()
Devuelve el grafo de Heawood.
@end deffn

@deffn {Función} icosahedron_graph ()
Devuelve el grafo icosaédrico.
@end deffn

@deffn {Función} icosidodecahedron_graph ()
Devuelve el grafo icosidodecaédrico.
@end deffn

@deffn {Función} induced_subgraph (@var{V}, @var{g})
Devuelve el grafo inducido por el subconjunto @var{V} de vértices del grafo @var{g}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c V : [0,1,2,3,4]$
@c g : induced_subgraph(V, p)$
@c print_graph(g)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) V : [0,1,2,3,4]$
(%i4) g : induced_subgraph(V, p)$
(%i5) print_graph(g)$
Graph on 5 vertices with 5 edges.
Adjacencies:
  4 :  3  0
  3 :  2  4
  2 :  1  3
  1 :  0  2
  0 :  1  4
@end example
@end deffn

@deffn {Función} line_graph (@var{g})
Devuelve el grafo de línea del grafo @var{g}.
@end deffn


@deffn {Función} make_graph (@var{vrt}, @var{f})
@deffnx {Función} make_graph (@var{vrt}, @var{f}, @var{oriented})
Crea un grafo por medio de la función de predicado @var{f}.

@var{vrt} es una lista o conjunto de vértices o un simplemente un número entero.
Si @var{vrt} es un número entero, entonces los vértices del grafo serán los
enteros desde 1 hasta @var{vrt}.

@var{f} es una función de predicado. Dos vértices @var{a} y @var{b} se conectarán
si @code{f(a,b)=true}.

Si @var{directed} no es @var{false}, entonces en grafo será dirigido.

Ejemplo 1:
@c ===beg===
@c load(graphs)$
@c g : make_graph(powerset({1,2,3,4,5}, 2), disjointp)$
@c is_isomorphic(g, petersen_graph());
@c get_vertex_label(1, g);
@c ===end===
@example
(%i1) load(graphs)$
(%i2) g : make_graph(powerset(@{1,2,3,4,5@}, 2), disjointp)$
(%i3) is_isomorphic(g, petersen_graph());
(%o3)                         true
(%i4) get_vertex_label(1, g);
(%o4)                        @{1, 2@}
@end example

Ejemplo 2:
@c ===beg===
@c load(graphs)$
@c f(i, j) := is (mod(j, i)=0)$
@c g : make_graph(20, f, directed=true)$
@c out_neighbors(4, g);
@c in_neighbors(18, g);
@c ===end===
@example
(%i1) load(graphs)$
(%i2) f(i, j) := is (mod(j, i)=0)$
(%i3) g : make_graph(20, f, directed=true)$
(%i4) out_neighbors(4, g);
(%o4)                    [8, 12, 16, 20]
(%i5) in_neighbors(18, g);
(%o5)                    [1, 2, 3, 6, 9]
@end example
@end deffn


@deffn {Función} mycielski_graph (@var{g})
Devuelve el grafo de Mycielski del grafo @var{g}.
@end deffn

@deffn {Función} new_graph ()
Devuelve el grafo sin vértices ni aristas.
@end deffn

@deffn {Función} path_digraph (@var{n})
Devuelve el camino dirigido de @var{n} vértices.
@end deffn

@deffn {Función} path_graph (@var{n})
Devuelve el camino de @var{n} vértices.
@end deffn

@deffn {Función} petersen_graph ()
@deffnx {Función} petersen_graph (@var{n}, @var{d})
Devuelve el grafo de Petersen @var{P_@{n,d@}}. Los valores por
defecto para @var{n} y @var{d} son @code{n=5} y @code{d=2}.
@end deffn

@deffn {Función} random_bipartite_graph (@var{a}, @var{b}, @var{p})
Devuelve un grafo aleatorio bipartido a partir de los vértices @code{a+b}. Cada
arista se genera con probabilidad @var{p}.
@end deffn

@deffn {Función} random_digraph (@var{n}, @var{p})
Devuelve un grafo aleatorio dirigido de @var{n} vértices. Cada arco se presenta
con una probabilidad @var{p}.
@end deffn

@deffn {Función} random_regular_graph (@var{n})
@deffnx {Función} random_regular_graph (@var{n}, @var{d})
Devuelve un grafo aleatorio @var{d}-regular de @var{n} vértices. El valor
por defecto para @var{d} es @code{d=3}.
@end deffn

@deffn {Función} random_graph (@var{n}, @var{p})
Devuelve un grafo aleatorio de @var{n} vértices. Cada arco se presenta
con una probabilidad @var{p}.
@end deffn

@deffn {Función} random_graph1 (@var{n}, @var{m})
Devuelve un grafo aleatorio de @var{n} vértices y @var{m} arcos aleatorios.
@end deffn

@deffn {Función} random_network (@var{n}, @var{p}, @var{w})
Devuelve una red aleatoria de @var{n} vértices. Cada arco se presenta 
con probabilidad @var{p} y tiene un peso dentro del rango @code{[0,w]}.
La función devuelve una lista @code{[network, source, sink]}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c [net, s, t] : random_network(50, 0.2, 10.0);
@c max_flow(net, s, t)$
@c first(%);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) [net, s, t] : random_network(50, 0.2, 10.0);
(%o2)                         [DIGRAPH, 50, 51]
(%i3) max_flow(net, s, t)$
(%i4) first(%);
(%o4)                   27.65981397932507
@end example
@end deffn

@deffn {Función} random_tournament (@var{n})
Devuelve un torneo aleatorio de @var{n} vértices.
@end deffn

@deffn {Función} random_tree (@var{n})
Devuelve un árbol aleatorio de @var{n} vértices.
@end deffn

@deffn {Función} small_rhombicosidodecahedron_graph ()
Devuelve el grafo pequeño rombicosidodecaédrico.
@end deffn

@deffn {Función} small_rhombicuboctahedron_graph ()
Devuelve el grafo pequeño rombicocubicooctaédrico.
@end deffn

@deffn {Función} snub_cube_graph ()
Devuelve el grafo cúbico volteado.
@end deffn

@deffn {Función} snub_dodecahedron_graph ()
Devuelve el grafo dodecaédrico volteado.
@end deffn

@deffn {Función} truncated_cube_graph ()
Devuelve el grafo cúbico truncado.
@end deffn

@deffn {Función} truncated_dodecahedron_graph ()
Devuelve el grafo dodecaédrico truncado.
@end deffn

@deffn {Función} truncated_icosahedron_graph ()
Devuelve el grafo icosaédrico truncado.
@end deffn

@deffn {Función} truncated_tetrahedron_graph ()
Devuelve el grafo del tetraedro truncado.
@end deffn

@deffn {Función} tutte_graph ()
Devuelve el grafo de Tutte.
@end deffn

@deffn {Función} underlying_graph (@var{g})
Devuelve el grafo asociado al grafo orientado @var{g}.
@end deffn

@deffn {Función} wheel_graph (@var{n})
Devuelve el grafo de rueda de @var{n+1} vértices.
@end deffn

@subsection Propiedades de los grafos

@deffn {Función} adjacency_matrix (@var{gr})
Devuelve la matriz de adyacencia del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c c5 : cycle_graph(4)$
@c adjacency_matrix(c5);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) c5 : cycle_graph(4)$
(%i3) adjacency_matrix(c5);
                                [ 0  1  0  1 ]
                                [            ]
                                [ 1  0  1  0 ]
(%o3)                           [            ]
                                [ 0  1  0  1 ]
                                [            ]
                                [ 1  0  1  0 ]
@end example
@end deffn

@deffn {Función} average_degree (@var{gr})
Devuelve el grado medio de los vértices del garfo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c average_degree(grotzch_graph());
@c ===end===
@example
(%i1) load (graphs)$
(%i2) average_degree(grotzch_graph());
                                      40
(%o2)                                 --
                                      11
@end example
@end deffn

@deffn {Función} biconnected_components (@var{gr})
Devuelve los subconjuntos de vértices biconectados del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : create_graph(
@c             [1,2,3,4,5,6,7],
@c             [
@c              [1,2],[2,3],[2,4],[3,4],
@c              [4,5],[5,6],[4,6],[6,7]
@c             ])$
@c biconnected_components(g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : create_graph(
            [1,2,3,4,5,6,7],
            [
             [1,2],[2,3],[2,4],[3,4],
             [4,5],[5,6],[4,6],[6,7]
            ])$
(%i3) biconnected_components(g);
(%o3)               [[6, 7], [4, 5, 6], [1, 2], [2, 3, 4]]
@end example

@ifhtml
@image{../figures/graphs13,6cm}
@end ifhtml
@end deffn

@deffn {Función} bipartition (@var{gr})
Devuelve una bipartición de los vértices del grafo @var{gr}, o una
lista vacía si @var{gr} no es bipartido.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c h : heawood_graph()$
@c [A,B]:bipartition(h);
@c draw_graph(h, show_vertices=A, program=circular)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) h : heawood_graph()$
(%i3) [A,B]:bipartition(h);
(%o3)         [[8, 12, 6, 10, 0, 2, 4], [13, 5, 11, 7, 9, 1, 3]]
(%i4) draw_graph(h, show_vertices=A, program=circular)$
@end example
@end deffn

@ifhtml
@image{../figures/graphs02,6cm}
@end ifhtml

@deffn {Función} chromatic_index (@var{gr})
Devuelve el índice cromático del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c chromatic_index(p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) chromatic_index(p);
(%o3)                                  4
@end example
@end deffn

@deffn {Función} chromatic_number (@var{gr})
Devuelve el número cromático del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c chromatic_number(cycle_graph(5));
@c chromatic_number(cycle_graph(6));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) chromatic_number(cycle_graph(5));
(%o2)                                  3
(%i3) chromatic_number(cycle_graph(6));
(%o3)                                  2
@end example
@end deffn

@deffn {Función} clear_edge_weight (@var{e}, @var{gr})
Elimina el peso del arco @var{e} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : create_graph(3, [[[0,1], 1.5], [[1,2], 1.3]])$
@c get_edge_weight([0,1], g);
@c clear_edge_weight([0,1], g)$
@c get_edge_weight([0,1], g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : create_graph(3, [[[0,1], 1.5], [[1,2], 1.3]])$
(%i3) get_edge_weight([0,1], g);
(%o3)                                 1.5
(%i4) clear_edge_weight([0,1], g)$
(%i5) get_edge_weight([0,1], g);
(%o5)                                  1
@end example
@end deffn

@deffn {Función} clear_vertex_label (@var{v}, @var{gr})
Elimina la etiqueta del vértice @var{v} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : create_graph([[0,"Zero"], [1, "One"]], [[0,1]])$
@c get_vertex_label(0, g);
@c clear_vertex_label(0, g);
@c get_vertex_label(0, g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : create_graph([[0,"Zero"], [1, "One"]], [[0,1]])$
(%i3) get_vertex_label(0, g);
(%o3)                               Zero
(%i4) clear_vertex_label(0, g);
(%o4)                               done
(%i5) get_vertex_label(0, g);
(%o5)                               false
@end example
@end deffn

@deffn {Función} connected_components (@var{gr})
Devuelve las componentes conexas del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g: graph_union(cycle_graph(5), path_graph(4))$
@c connected_components(g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g: graph_union(cycle_graph(5), path_graph(4))$
(%i3) connected_components(g);
(%o3)                  [[1, 2, 3, 4, 0], [8, 7, 6, 5]]
@end example
@end deffn

@deffn {Función} diameter (@var{gr})
Devuelve el diámetro del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c diameter(dodecahedron_graph());
@c ===end===
@example
(%i1) load (graphs)$
(%i2) diameter(dodecahedron_graph());
(%o2)                                 5
@end example
@end deffn

@deffn {Función} edge_coloring (@var{gr})
Devuelve una coloración óptima de los arcos del grafo @var{gr}.

La función devuelve el índice cromático y una lista
que representa el coloreado de los arcos de @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c [ch_index, col] : edge_coloring(p);
@c assoc([0,1], col);
@c assoc([0,5], col);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) [ch_index, col] : edge_coloring(p);
(%o3) [4, [[[0, 5], 3], [[5, 7], 1], [[0, 1], 1], [[1, 6], 2], 
[[6, 8], 1], [[1, 2], 3], [[2, 7], 4], [[7, 9], 2], [[2, 3], 2], 
[[3, 8], 3], [[5, 8], 2], [[3, 4], 1], [[4, 9], 4], [[6, 9], 3], 
[[0, 4], 2]]]
(%i4) assoc([0,1], col);
(%o4)                           1
(%i5) assoc([0,5], col);
(%o5)                           3
@end example
@end deffn

@deffn {Función} degree_sequence (@var{gr})
Devuelve una lista con los grados de los vértices del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c degree_sequence(random_graph(10, 0.4));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) degree_sequence(random_graph(10, 0.4));
(%o2)            [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
@end example
@end deffn

@deffn {Función} edge_connectivity (@var{gr})
Devuelve la conectividad de las aristas del grafo @var{gr}.

Véase también @code{min_edge_cut}.
@end deffn

@deffn {Función} edges (@var{gr})
Devuelve la lista de las aristas (arcos) del grafo (dirigido) @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c edges(complete_graph(4));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) edges(complete_graph(4));
(%o2)         [[2, 3], [1, 3], [1, 2], [0, 3], [0, 2], [0, 1]]
@end example
@end deffn

@deffn {Función} get_edge_weight (@var{e}, @var{gr})
@deffnx {Función} get_edge_weight (@var{e}, @var{gr}, @var{ifnot})
Devuelve el peso de la arista @var{e} del grafo @var{gr}.

Si la arista no tiene peso, la función devuelve 1. Si la arista no
pertenece al grafo, la función emite un mensaje de error o devuelve
el argumento opcional @var{ifnot}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c c5 : cycle_graph(5)$
@c get_edge_weight([1,2], c5);
@c set_edge_weight([1,2], 2.0, c5);
@c get_edge_weight([1,2], c5);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) c5 : cycle_graph(5)$
(%i3) get_edge_weight([1,2], c5);
(%o3)                                 1
(%i4) set_edge_weight([1,2], 2.0, c5);
(%o4)                               done
(%i5) get_edge_weight([1,2], c5);
(%o5)                                2.0
@end example
@end deffn

@deffn {Función} get_vertex_label (@var{v}, @var{gr})
Devuelve la etiqueta del vértice @var{v} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : create_graph([[0,"Zero"], [1, "One"]], [[0,1]])$
@c get_vertex_label(0, g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : create_graph([[0,"Zero"], [1, "One"]], [[0,1]])$
(%i3) get_vertex_label(0, g);
(%o3)                               Zero
@end example
@end deffn

@deffn {Función} graph_charpoly (@var{gr}, @var{x})
Devuelve el polinomio característico (de variable @var{x})
del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c graph_charpoly(p, x), factor;
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) graph_charpoly(p, x), factor;
                                         5        4
(%o3)                     (x - 3) (x - 1)  (x + 2)
@end example
@end deffn

@deffn {Función} graph_center (@var{gr})
Devuelve el centro del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : grid_graph(5,5)$
@c graph_center(g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : grid_graph(5,5)$
(%i3) graph_center(g);
(%o3)                               [12]
@end example
@end deffn

@deffn {Función} graph_eigenvalues (@var{gr})
Devuelve los valores propios del grafo @var{gr}. La función
devuelve los valores propios en el mismo formato en el que lo 
hace la función @code{eigenvalue}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c graph_eigenvalues(p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) graph_eigenvalues(p);
(%o3)                     [[3, - 2, 1], [1, 4, 5]]
@end example
@end deffn

@deffn {Función} graph_periphery (@var{gr})
Devuelve la periferia del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : grid_graph(5,5)$
@c graph_periphery(g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : grid_graph(5,5)$
(%i3) graph_periphery(g);
(%o3)                          [24, 20, 4, 0]
@end example
@end deffn

@deffn {Función} graph_size (@var{gr})
Devuelve el número de aristas del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c graph_size(p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) graph_size(p);
(%o3)                                15
@end example
@end deffn

@deffn {Función} graph_order (@var{gr})
Devuelve el número de vértices del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c graph_order(p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) graph_order(p);
(%o3)                                10
@end example
@end deffn

@deffn {Función} girth (@var{gr})
Devuelve la longitud del ciclo más corto del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : heawood_graph()$
@c girth(g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : heawood_graph()$
(%i3) girth(g);
(%o3)                                 6
@end example
@end deffn

@deffn {Función} hamilton_cycle (@var{gr})
Devuelve el ciclo de Hamilton del grafo @var{gr} o una lista vacía
si @var{gr} no es hamiltoniano.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c c : cube_graph(3)$
@c hc : hamilton_cycle(c);
@c draw_graph(c, show_edges=vertices_to_cycle(hc))$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) c : cube_graph(3)$
(%i3) hc : hamilton_cycle(c);
(%o3)              [7, 3, 2, 6, 4, 0, 1, 5, 7]
(%i4) draw_graph(c, show_edges=vertices_to_cycle(hc))$
@end example
@end deffn

@ifhtml
@image{../figures/graphs03,6cm}
@end ifhtml

@deffn {Función} hamilton_path (@var{gr})
Devuelve el camino de Hamilton del grafo @var{gr} o una lista vacía
si @var{gr} no los tiene.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c hp : hamilton_path(p);
@c draw_graph(p, show_edges=vertices_to_path(hp))$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) hp : hamilton_path(p);
(%o3)                  [0, 5, 7, 2, 1, 6, 8, 3, 4, 9]
(%i4) draw_graph(p, show_edges=vertices_to_path(hp))$
@end example
@end deffn

@ifhtml
@image{../figures/graphs04,6cm}
@end ifhtml

@deffn {Función} isomorphism (@var{gr1}, @var{gr2})
Devuelve un isomorfismo entre los grafos/digrafos @var{gr1} y @var{gr2}.
Si @var{gr1} y @var{gr2} no son isomorfos, devuelve una lista vacía.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c clk5:complement_graph(line_graph(complete_graph(5)))$
@c isomorphism(clk5, petersen_graph());
@c ===end===
@example
(%i1) load (graphs)$
(%i2) clk5:complement_graph(line_graph(complete_graph(5)))$
(%i3) isomorphism(clk5, petersen_graph());
(%o3) [9 -> 0, 2 -> 1, 6 -> 2, 5 -> 3, 0 -> 4, 1 -> 5, 3 -> 6, 
                                          4 -> 7, 7 -> 8, 8 -> 9]
@end example
@end deffn

@deffn {Función} in_neighbors (@var{v}, @var{gr})
Devuelve la lista de los nodos hijos del vértice @var{v}
del grafo orientado @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : path_digraph(3)$
@c in_neighbors(2, p);
@c out_neighbors(2, p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : path_digraph(3)$
(%i3) in_neighbors(2, p);
(%o3)                                 [1]
(%i4) out_neighbors(2, p);
(%o4)                                 []
@end example
@end deffn

@deffn {Función} is_biconnected (@var{gr})
Devuelve @code{true} si @var{gr} está biconectado y @code{false}
en caso contrario.

Ejemplo:

Example:
@c ===beg===
@c load (graphs)$
@c is_biconnected(cycle_graph(5));
@c is_biconnected(path_graph(5));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_biconnected(cycle_graph(5));
(%o2)                         true
(%i3) is_biconnected(path_graph(5));
(%o3)                         false
@end example
@end deffn

@deffn {Función} is_bipartite (@var{gr})
Devuelve @code{true} si @var{gr} es bipartido (2-coloreable) y @code{false}
en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c is_bipartite(petersen_graph());
@c is_bipartite(heawood_graph());
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_bipartite(petersen_graph());
(%o2)                               false
(%i3) is_bipartite(heawood_graph());
(%o3)                               true
@end example
@end deffn

@deffn {Función} is_connected (@var{gr})
Devuelve @code{true} si el grafo @var{gr} es conexo y @code{false}
en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c is_connected(graph_union(cycle_graph(4), path_graph(3)));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_connected(graph_union(cycle_graph(4), path_graph(3)));
(%o2)                               false
@end example
@end deffn

@deffn {Función} is_digraph (@var{gr})
Devuelve @code{true} si @var{gr} es un grafo orientado (digrafo) y
@code{false} en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c is_digraph(path_graph(5));
@c is_digraph(path_digraph(5));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_digraph(path_graph(5));
(%o2)                               false
(%i3) is_digraph(path_digraph(5));
(%o3)                               true
@end example
@end deffn

@deffn {Función} is_edge_in_graph (@var{e}, @var{gr})
Devuelve @code{true} si @var{e} es una arista (arco) del
grafo (digrafo) @var{g} y @code{false} en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c c4 : cycle_graph(4)$
@c is_edge_in_graph([2,3], c4);
@c is_edge_in_graph([3,2], c4);
@c is_edge_in_graph([2,4], c4);
@c is_edge_in_graph([3,2], cycle_digraph(4));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) c4 : cycle_graph(4)$
(%i3) is_edge_in_graph([2,3], c4);
(%o3)                               true
(%i4) is_edge_in_graph([3,2], c4);
(%o4)                               true
(%i5) is_edge_in_graph([2,4], c4);
(%o5)                               false
(%i6) is_edge_in_graph([3,2], cycle_digraph(4));
(%o6)                               false
@end example
@end deffn

@deffn {Función} is_graph (@var{gr})
Devuelve @code{true} si @var{gr} es un grafo y @code{false} en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c is_graph(path_graph(5));
@c is_graph(path_digraph(5));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_graph(path_graph(5));
(%o2)                               true
(%i3) is_graph(path_digraph(5));
(%o3)                               false
@end example
@end deffn

@deffn {Función} is_graph_or_digraph (@var{gr})
Devuelve @code{true} si @var{gr} es una grafo, orientado o no,
y @code{false} en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c is_graph_or_digraph(path_graph(5));
@c is_graph_or_digraph(path_digraph(5));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_graph_or_digraph(path_graph(5));
(%o2)                               true
(%i3) is_graph_or_digraph(path_digraph(5));
(%o3)                               true
@end example
@end deffn

@deffn {Función} is_isomorphic (@var{gr1}, @var{gr2})
Devuelve @code{true} si los grafos/digrafos @var{gr1} y @var{gr2} son
isomorfos y @code{false} en caso contrario.

Véase también @code{isomorphism}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c clk5:complement_graph(line_graph(complete_graph(5)))$
@c is_isomorphic(clk5, petersen_graph());
@c ===end===
@example
(%i1) load (graphs)$
(%i2) clk5:complement_graph(line_graph(complete_graph(5)))$
(%i3) is_isomorphic(clk5, petersen_graph());
(%o3)                         true
@end example
@end deffn

@deffn {Función} is_planar (@var{gr})
Devuelve @code{true} si @var{gr} es un grafo planar y @code{false} en caso contrario.

El algoritmo utilizado es el de Demoucron, que es de tiempo cuadrático.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c is_planar(dodecahedron_graph());
@c is_planar(petersen_graph());
@c is_planar(petersen_graph(10,2));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_planar(dodecahedron_graph());
(%o2)                                true
(%i3) is_planar(petersen_graph());
(%o3)                                false
(%i4) is_planar(petersen_graph(10,2));
(%o4)                                true
@end example
@end deffn

@deffn {Función} is_sconnected (@var{gr})
Devuelve @code{true} si el grafo orientado @var{gr} es fuertemente conexo,
devolviendo @code{false} en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c is_sconnected(cycle_digraph(5));
@c is_sconnected(path_digraph(5));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_sconnected(cycle_digraph(5));
(%o2)                               true
(%i3) is_sconnected(path_digraph(5));
(%o3)                               false
@end example
@end deffn

@deffn {Función} is_vertex_in_graph (@var{v}, @var{gr})
Devuelve @code{true} si @var{v} es un vértice del grafo @var{g}
y @code{false} en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c c4 : cycle_graph(4)$
@c is_vertex_in_graph(0, c4);
@c is_vertex_in_graph(6, c4);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) c4 : cycle_graph(4)$
(%i3) is_vertex_in_graph(0, c4);
(%o3)                               true
(%i4) is_vertex_in_graph(6, c4);
(%o4)                               false
@end example
@end deffn

@deffn {Función} is_tree (@var{gr})
Devuelve @code{true} si @var{gr} es un árbol y @code{false} en caso contrario.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c is_tree(random_tree(4));
@c is_tree(graph_union(random_tree(4), random_tree(5)));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) is_tree(random_tree(4));
(%o2)                               true
(%i3) is_tree(graph_union(random_tree(4), random_tree(5)));
(%o3)                               false
@end example
@end deffn

@deffn {Función} laplacian_matrix (@var{gr})
Devuelve el laplaciano de la matriz del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c laplacian_matrix(cycle_graph(5));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) laplacian_matrix(cycle_graph(5));
                          [  2   - 1   0    0   - 1 ]
                          [                         ]
                          [ - 1   2   - 1   0    0  ]
                          [                         ]
(%o2)                     [  0   - 1   2   - 1   0  ]
                          [                         ]
                          [  0    0   - 1   2   - 1 ]
                          [                         ]
                          [ - 1   0    0   - 1   2  ]
@end example
@end deffn

@deffn {Función} max_clique (@var{gr})
Devuelve el clique máximo del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : random_graph(100, 0.5)$
@c max_clique(g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : random_graph(100, 0.5)$
(%i3) max_clique(g);
(%o3)       [6, 12, 31, 36, 52, 59, 62, 63, 80]
@end example
@end deffn

@deffn {Función} max_degree (@var{gr})
Devuelve el grado máximo de los vértices del grafo @var{gr} y un 
vértice de grado máximo.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : random_graph(100, 0.02)$
@c max_degree(g);
@c vertex_degree(95, g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : random_graph(100, 0.02)$
(%i3) max_degree(g);
(%o3)                        [6, 79]
(%i4) vertex_degree(95, g);
(%o4)                           3
@end example
@end deffn

@deffn {Función} max_flow (@var{net}, @var{s}, @var{t})
Devuelve el flujo maximal de la red @var{net} con origen en
@var{s} y final en @var{t}.

La función devuelve el valor del flujo maximal y una lista con los
pesos de los arcos del flujo óptimo.

Ejemplo:

Example:
@c ===beg===
@c load (graphs)$
@c net : create_graph(
@c   [1,2,3,4,5,6],
@c   [[[1,2], 1.0],
@c    [[1,3], 0.3],
@c    [[2,4], 0.2],
@c    [[2,5], 0.3],
@c    [[3,4], 0.1],
@c    [[3,5], 0.1],
@c    [[4,6], 1.0],
@c    [[5,6], 1.0]],
@c   directed=true)$
@c [flow_value, flow] : max_flow(net, 1, 6);
@c fl : 0$
@c for u in out_neighbors(1, net) 
@c      do fl : fl + assoc([1, u], flow)$
@c fl;
@c ===end===
@example
(%i1) load (graphs)$
(%i2) net : create_graph(
  [1,2,3,4,5,6],
  [[[1,2], 1.0],
   [[1,3], 0.3],
   [[2,4], 0.2],
   [[2,5], 0.3],
   [[3,4], 0.1],
   [[3,5], 0.1],
   [[4,6], 1.0],
   [[5,6], 1.0]],
  directed=true)$
(%i3) [flow_value, flow] : max_flow(net, 1, 6);
(%o3) [0.7, [[[1, 2], 0.5], [[1, 3], 0.2], [[2, 4], 0.2],
[[2, 5], 0.3], [[3, 4], 0.1], [[3, 5], 0.1], [[4, 6], 0.3],
[[5, 6], 0.4]]]
(%i4) fl : 0$
(%i5) for u in out_neighbors(1, net) 
         do fl : fl + assoc([1, u], flow)$
(%i6) fl;
(%o6)                                 0.7
@end example
@end deffn

@deffn {Función} max_independent_set (@var{gr})
Devuelve un conjunto maximal independiente de vértices del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c d : dodecahedron_graph()$
@c mi : max_independent_set(d);
@c draw_graph(d, show_vertices=mi)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) d : dodecahedron_graph()$
(%i3) mi : max_independent_set(d);
(%o3)             [0, 3, 5, 9, 10, 11, 18, 19]
(%i4) draw_graph(d, show_vertices=mi)$
@end example
@end deffn

@ifhtml
@image{../figures/graphs05,6cm}
@end ifhtml

@deffn {Función} max_matching (@var{gr})
Devuelve un conjunto maximal independiente de aristas del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c d : dodecahedron_graph()$
@c m : max_matching(d);
@c draw_graph(d, show_edges=m)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) d : dodecahedron_graph()$
(%i3) m : max_matching(d);
(%o3) [[5, 7], [8, 9], [6, 10], [14, 19], [13, 18], [12, 17], 
                               [11, 16], [0, 15], [3, 4], [1, 2]]
(%i4) draw_graph(d, show_edges=m)$
@end example
@end deffn

@ifhtml
@image{../figures/graphs06,6cm}
@end ifhtml

@deffn {Función} min_degree (@var{gr})
Devuelve el grado mínimo de los vértices del grafo @var{gr} y un 
vértice de grado mínimo.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : random_graph(100, 0.1)$
@c min_degree(g);
@c vertex_degree(21, g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : random_graph(100, 0.1)$
(%i3) min_degree(g);
(%o3)                              [3, 49]
(%i4) vertex_degree(21, g);
(%o4)                                 9
@end example
@end deffn

@deffn {Función} min_edge_cut (@var{gr})
Devuelve el mínimo @i{edge cut} del grafo @var{gr}. Un @i{edge cut} es
un conjunto de aristas cuya eliminación aumenta el número de componentes del grafo.

Véase también @code{edge_connectivity}.
@end deffn

@deffn {Función} min_vertex_cover (@var{gr})
Devuelve el mínimo nodo @i{covering} del grafo @var{gr}.
@c Esta traduccion esta tomada de la wikipedia. Habra que revisarla.
@end deffn

@deffn {Función} min_vertex_cut (@var{gr})
Devuelve el mínimo @i{vertex cut} del grafo @var{gr}.

Véase también @code{vertex_connectivity}.
@end deffn


@deffn {Función} minimum_spanning_tree (@var{gr})
Devuelve el grafo de expansión mínimo del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : graph_product(path_graph(10), path_graph(10))$
@c t : minimum_spanning_tree(g)$
@c draw_graph(g, show_edges=edges(t))$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : graph_product(path_graph(10), path_graph(10))$
(%i3) t : minimum_spanning_tree(g)$
(%i4) draw_graph(g, show_edges=edges(t))$
@end example
@end deffn

@ifhtml
@image{../figures/graphs07,6cm}
@end ifhtml

@deffn {Función} neighbors (@var{v}, @var{gr})
Devuelve la lista de los vecinos del vértice @var{v} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : petersen_graph()$
@c neighbors(3, p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : petersen_graph()$
(%i3) neighbors(3, p);
(%o3)                             [4, 8, 2]
@end example
@end deffn

@deffn {Función} odd_girth (@var{gr})
Devuelve la longitud del ciclo impar más corto del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : graph_product(cycle_graph(4), cycle_graph(7))$
@c girth(g);
@c odd_girth(g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : graph_product(cycle_graph(4), cycle_graph(7))$
(%i3) girth(g);
(%o3)                                 4
(%i4) odd_girth(g);
(%o4)                                 7
@end example
@end deffn

@deffn {Función} out_neighbors (@var{v}, @var{gr})
Devuelve la lista de los nodos padres del vértice @var{v} del grafo
orientado @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : path_digraph(3)$
@c in_neighbors(2, p);
@c out_neighbors(2, p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : path_digraph(3)$
(%i3) in_neighbors(2, p);
(%o3)                                 [1]
(%i4) out_neighbors(2, p);
(%o4)                                 []
@end example
@end deffn

@deffn {Función} planar_embedding (@var{gr})
Devuelve la lista de caminos faciales en una proyección planar de @var{gr},
o @code{false} si @var{gr} no es un grafo planar.

El grafo @var{gr} debe estar biconectado.

El algoritmo utilizado es el de Demoucron, que es de tiempo cuadrático.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c planar_embedding(grid_graph(3,3));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) planar_embedding(grid_graph(3,3));
(%o2) [[3, 6, 7, 8, 5, 2, 1, 0], [4, 3, 0, 1], [3, 4, 7, 6], 
                                      [8, 7, 4, 5], [1, 2, 5, 4]]
@end example
@end deffn

@deffn {Función} print_graph (@var{gr})
Muestra alguna información sobre el grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c c5 : cycle_graph(5)$
@c print_graph(c5)$
@c dc5 : cycle_digraph(5)$
@c print_graph(dc5)$
@c out_neighbors(0, dc5);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) c5 : cycle_graph(5)$
(%i3) print_graph(c5)$
Graph on 5 vertices with 5 edges.
Adjacencies:
  4 :  0  3
  3 :  4  2
  2 :  3  1
  1 :  2  0
  0 :  4  1
(%i4) dc5 : cycle_digraph(5)$
(%i5) print_graph(dc5)$
Digraph on 5 vertices with 5 arcs.
Adjacencies:
  4 :  0
  3 :  4
  2 :  3
  1 :  2
  0 :  1
(%i6) out_neighbors(0, dc5);
(%o6)                                [1]
@end example
@end deffn

@deffn {Función} radius (@var{gr})
Devuelve el radio del grafo  @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c radius(dodecahedron_graph());
@c ===end===
@example
(%i1) load (graphs)$
(%i2) radius(dodecahedron_graph());
(%o2)                                 5
@end example
@end deffn

@deffn {Función} set_edge_weight (@var{e}, @var{w}, @var{gr})
Asigna el peso @var{w} a la arista @var{e} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : create_graph([1, 2], [[[1,2], 1.2]])$
@c get_edge_weight([1,2], g);
@c set_edge_weight([1,2], 2.1, g);
@c get_edge_weight([1,2], g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : create_graph([1, 2], [[[1,2], 1.2]])$
(%i3) get_edge_weight([1,2], g);
(%o3)                                1.2
(%i4) set_edge_weight([1,2], 2.1, g);
(%o4)                               done
(%i5) get_edge_weight([1,2], g);
(%o5)                                2.1
@end example
@end deffn

@deffn {Función} set_vertex_label (@var{v}, @var{l}, @var{gr})
Asigna la etiqueta @var{l} al vértice @var{v} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : create_graph([[1, "One"], [2, "Two"]], [[1,2]])$
@c get_vertex_label(1, g);
@c set_vertex_label(1, "oNE", g);
@c get_vertex_label(1, g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : create_graph([[1, "One"], [2, "Two"]], [[1,2]])$
(%i3) get_vertex_label(1, g);
(%o3)                                One
(%i4) set_vertex_label(1, "oNE", g);
(%o4)                               done
(%i5) get_vertex_label(1, g);
(%o5)                                oNE
@end example
@end deffn

@deffn {Función} shortest_path (@var{u}, @var{v}, @var{gr})
Devuelve el camino más corto desde @var{u} hasta @var{v} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c d : dodecahedron_graph()$
@c path : shortest_path(0, 7, d);
@c draw_graph(d, show_edges=vertices_to_path(path))$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) d : dodecahedron_graph()$
(%i3) path : shortest_path(0, 7, d);
(%o3)                          [0, 1, 19, 13, 7]
(%i4) draw_graph(d, show_edges=vertices_to_path(path))$
@end example
@end deffn

@ifhtml
@image{../figures/graphs08,6cm}
@end ifhtml


@deffn {Función} shortest_weighted_path (@var{u}, @var{v}, @var{gr})
Devuelve la longitud del camino más corto ponderado y el propio camino
más corto ponderado desde @var{u} hasta @var{v} en el grafo @var{gr}.

La longitud del camino ponderado es la suma de los pesos de las aristas
del camino. Si una arista no tiene peso asignado, su valor por defecto
es la unidad.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g: petersen_graph(20, 2)$
@c for e in edges(g) do set_edge_weight(e, random(1.0), g)$
@c shortest_weighted_path(0, 10, g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g: petersen_graph(20, 2)$
(%i3) for e in edges(g) do set_edge_weight(e, random(1.0), g)$
(%i4) shortest_weighted_path(0, 10, g);
(%o4) [2.575143920268482, [0, 20, 38, 36, 34, 32, 30, 10]]
@end example

@end deffn


@deffn {Función} strong_components (@var{gr})
Devuelve las componentes fuertes del grafo orientado @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c t : random_tournament(4)$
@c strong_components(t);
@c vertex_out_degree(3, t);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) t : random_tournament(4)$
(%i3) strong_components(t);
(%o3)                         [[1], [0], [2], [3]]
(%i4) vertex_out_degree(3, t);
(%o4)                                 3
@end example
@end deffn

@deffn {Función} topological_sort (@var{dag})
Devuelve el orden topológico de los vértices del grafo orientado @var{dag}
o una lista vacía si @var{dag} no es un grafo orientado
acíclico.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g:create_graph(
@c          [1,2,3,4,5],
@c          [
@c           [1,2], [2,5], [5,3],
@c           [5,4], [3,4], [1,3]
@c          ],
@c          directed=true)$
@c topological_sort(g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g:create_graph(
         [1,2,3,4,5],
         [
          [1,2], [2,5], [5,3],
          [5,4], [3,4], [1,3]
         ],
         directed=true)$
(%i3) topological_sort(g);
(%o3)                           [1, 2, 5, 3, 4]
@end example
@end deffn

@deffn {Función} vertex_connectivity (@var{g})
Devuelve la conectividad de los vértices del grafo @var{g}.

Véase también @code{min_vertex_cut}.
@end deffn

@deffn {Función} vertex_degree (@var{v}, @var{gr})
Devuelve el grado del vértice @var{v} del grafo @var{gr}.
@end deffn

@deffn {Función} vertex_distance (@var{u}, @var{v}, @var{gr})
Devuelve la longitud del camino más corto entre @var{u} y @var{v}
del grafo o digrafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c d : dodecahedron_graph()$
@c vertex_distance(0, 7, d);
@c shortest_path(0, 7, d);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) d : dodecahedron_graph()$
(%i3) vertex_distance(0, 7, d);
(%o3)                                 4
(%i4) shortest_path(0, 7, d);
(%o4)                         [0, 1, 19, 13, 7]
@end example
@end deffn

@deffn {Función} vertex_eccentricity (@var{v}, @var{gr})
Devuelve la excentricidad del vértice @var{v} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g:cycle_graph(7)$
@c vertex_eccentricity(0, g);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g:cycle_graph(7)$
(%i3) vertex_eccentricity(0, g);
(%o3)                           3
@end example
@end deffn

@deffn {Función} vertex_in_degree (@var{v}, @var{gr})
Devuelve el grado de entrada del vértice @var{v} del grafo 
orientado @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p5 : path_digraph(5)$
@c print_graph(p5)$
@c vertex_in_degree(4, p5);
@c in_neighbors(4, p5);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p5 : path_digraph(5)$
(%i3) print_graph(p5)$
Digraph on 5 vertices with 4 arcs.
Adjacencies:
  4 :
  3 :  4
  2 :  3
  1 :  2
  0 :  1
(%i4) vertex_in_degree(4, p5);
(%o4)                                 1
(%i5) in_neighbors(4, p5);
(%o5)                                [3]
@end example
@end deffn

@deffn {Función} vertex_out_degree (@var{v}, @var{gr})
Devuelve el grado de salida del vértice @var{v} del grafo
orientado @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c t : random_tournament(10)$
@c vertex_out_degree(0, t);
@c out_neighbors(0, t);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) t : random_tournament(10)$
(%i3) vertex_out_degree(0, t);
(%o3)                           2
(%i4) out_neighbors(0, t);
(%o4)                        [7, 1]
@end example
@end deffn

@deffn {Función} vertices (@var{gr})
Devuelve la lista de vértices del grafo @var{gr}.

Example

@c ===beg===
@c load (graphs)$
@c vertices(complete_graph(4));
@c ===end===
@example
(%i1) load (graphs)$
(%i2) vertices(complete_graph(4));
(%o2)                           [3, 2, 1, 0]
@end example
@end deffn

@deffn {Función} vertex_coloring (@var{gr})
Devuelve un coloreado óptimo de los vértices del grafo @var{gr}.

La función devuelve el número cromático y una lista 
representando el coloreado de los vértices de @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p:petersen_graph()$
@c vertex_coloring(p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p:petersen_graph()$
(%i3) vertex_coloring(p);
(%o3) [3, [[0, 2], [1, 3], [2, 2], [3, 3], [4, 1], [5, 3], 
                                 [6, 1], [7, 1], [8, 2], [9, 2]]]
@end example
@end deffn

@deffn {Función} wiener_index (@var{gr})
Devuelve el índice de Wiener del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c wiener_index(dodecahedron_graph());
@c ===end===
@example
(%i1) wiener_index(dodecahedron_graph());
(%o1)                          500
@end example
@end deffn











@subsection Modificación de grafos


@deffn {Función} add_edge (@var{e}, @var{gr})
Añade la arista @var{e} al grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p : path_graph(4)$
@c neighbors(0, p);
@c add_edge([0,3], p);
@c neighbors(0, p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p : path_graph(4)$
(%i3) neighbors(0, p);
(%o3)                                [1]
(%i4) add_edge([0,3], p);
(%o4)                               done
(%i5) neighbors(0, p);
(%o5)                              [3, 1]
@end example
@end deffn

@deffn {Función} add_edges (@var{e_list}, @var{gr})
Añade las aristas de la lista  @var{e_list} al grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : empty_graph(3)$
@c add_edges([[0,1],[1,2]], g)$
@c print_graph(g)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : empty_graph(3)$
(%i3) add_edges([[0,1],[1,2]], g)$
(%i4) print_graph(g)$
Graph on 3 vertices with 2 edges.
Adjacencies:
  2 :  1
  1 :  2  0
  0 :  1
@end example
@end deffn

@deffn {Función} add_vertex (@var{v}, @var{gr})
Añade el vértice @var{v} al grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : path_graph(2)$
@c add_vertex(2, g)$
@c print_graph(g)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : path_graph(2)$
(%i3) add_vertex(2, g)$
(%i4) print_graph(g)$
Graph on 3 vertices with 1 edges.
Adjacencies:
  2 :
  1 :  0
  0 :  1
@end example
@end deffn

@deffn {Función} add_vertices (@var{v_list}, @var{gr})
Añade los vértices de la lista  @var{v_list} al grafo @var{gr}.
@end deffn

@deffn {Función} connect_vertices (@var{v_list}, @var{u_list}, @var{gr})
Conecta todos los vértices de la lista @var{v_list} con los vértices
de la lista @var{u_list} del grafo @var{gr}.

@var{v_list} y @var{u_list} pueden ser vértices aislados o una lista de
vértices.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g : empty_graph(4)$
@c connect_vertices(0, [1,2,3], g)$
@c print_graph(g)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g : empty_graph(4)$
(%i3) connect_vertices(0, [1,2,3], g)$
(%i4) print_graph(g)$
Graph on 4 vertices with 3 edges.
Adjacencies:
  3 :  0
  2 :  0
  1 :  0
  0 :  3  2  1
@end example
@end deffn

@deffn {Función} contract_edge (@var{e}, @var{gr})
Contrae la arista @var{e} del @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c g: create_graph(
@c       8, [[0,3],[1,3],[2,3],[3,4],[4,5],[4,6],[4,7]])$
@c print_graph(g)$
@c contract_edge([3,4], g)$
@c print_graph(g)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g: create_graph(
       8, [[0,3],[1,3],[2,3],[3,4],[4,5],[4,6],[4,7]])$
(%i3) print_graph(g)$
Graph on 8 vertices with 7 edges.
Adjacencies:
  7 :  4
  6 :  4
  5 :  4
  4 :  7  6  5  3
  3 :  4  2  1  0
  2 :  3
  1 :  3
  0 :  3
(%i4) contract_edge([3,4], g)$
(%i5) print_graph(g)$
Graph on 7 vertices with 6 edges.
Adjacencies:
  7 :  3
  6 :  3
  5 :  3
  3 :  5  6  7  2  1  0
  2 :  3
  1 :  3
  0 :  3
@end example
@end deffn

@deffn {Función} remove_edge (@var{e}, @var{gr})
Elimina la arista @var{e} del grafo @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c c3 : cycle_graph(3)$
@c remove_edge([0,1], c3)$
@c print_graph(c3)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) c3 : cycle_graph(3)$
(%i3) remove_edge([0,1], c3)$
(%i4) print_graph(c3)$
Graph on 3 vertices with 2 edges.
Adjacencies:
  2 :  0  1
  1 :  2
  0 :  2
@end example
@end deffn

@deffn {Función} remove_vertex (@var{v}, @var{gr})
Elimina el vértice @var{v} del grafo @var{gr}.
@end deffn

@deffn {Función} vertex_coloring (@var{gr})
Devuelve un coloreado óptimo de los vértice del grafo @var{gr}.

La función devuelve el número cromático y una lista representando 
el coloreado de los vértices de @var{gr}.

Ejemplo:

@c ===beg===
@c load (graphs)$
@c p:petersen_graph()$
@c vertex_coloring(p);
@c ===end===
@example
(%i1) load (graphs)$
(%i2) p:petersen_graph()$
(%i3) vertex_coloring(p);
(%o3) [3, [[0, 2], [1, 3], [2, 2], [3, 3], [4, 1], [5, 3], 
                                [6, 1], [7, 1], [8, 2], [9, 2]]]
@end example
@end deffn


@subsection Lectura y escritura de ficheros

@deffn {Función} dimacs_export (@var{gr}, @var{fl})
@deffnx {Función} dimacs_export (@var{gr}, @var{fl}, @var{comment1}, ..., @var{commentn})
Exporta el grafo al fichero @var{fl} en formato DIMACS. Los comentarios
adicionales se anãdirán al comienzo del fichero.
@end deffn

@deffn {Función} dimacs_import (@var{fl})
Lee el grafo almacenado en el fichero @var{fl} en formato DIMACS.
@end deffn

@deffn {Función} graph6_decode (@var{str})
Devuelve el grafo codificado en formato graph6 en la cadena @var{str}.
@end deffn

@deffn {Función} graph6_encode (@var{gr})
Devuelve una cadena codificando el grafo @var{gr} en formato graph6.
@end deffn

@deffn {Función} graph6_export (@var{gr_list}, @var{fl})
Exporta los grafos de la lista @var{gr_list} al fichero @var{fl} en formato graph6.
@end deffn

@deffn {Función} graph6_import (@var{fl})
Lee la lista de grafos almacenados en el fichero @var{fl} en formato graph6.
@end deffn

@deffn {Función} sparse6_decode (@var{str})
Devuelve el grafo codificado en formato sparse6 en la cadena @var{str}.
@end deffn

@deffn {Función} sparse6_encode (@var{gr})
Devuelve una cadena codificando el grafo @var{gr} en formato sparse6.
@end deffn

@deffn {Función} sparse6_export (@var{gr_list}, @var{fl})
Exporta los grafos de la lista @var{gr_list} al fichero @var{fl} en formato sparse6.
@end deffn

@deffn {Función} sparse6_import (@var{fl})
Lee la lista de grafos almacenados en el fichero @var{fl} en formato sparse6.
@end deffn

@subsection Visualización

@deffn {Función} draw_graph (@var{graph})
@deffnx {Función} draw_graph (@var{graph}, @var{option1}, ..., @var{optionk})
Dibuja el grafo utilizando el paquete @code{draw}.

El algoritmo utilizado para posicionar los vértices se especifica con el argumento
opcional @var{program}, cuyo valor por defecto es @code{program=spring_embedding}.
@var{draw_graph} también puede utilizar los programas de graphviz para
posicionar los vértices, para lo cual deberá instalarse separadamente el programa graphviz.

Ejemplo 1:

@c ===beg===
@c load (graphs)$
@c g:grid_graph(10,10)$
@c m:max_matching(g)$
@c draw_graph(g,
@c    spring_embedding_depth=100,
@c    show_edges=m, edge_type=dots,
@c    vertex_size=0)$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g:grid_graph(10,10)$
(%i3) m:max_matching(g)$
(%i4) draw_graph(g,
   spring_embedding_depth=100,
   show_edges=m, edge_type=dots,
   vertex_size=0)$
@end example

@ifhtml
@image{../figures/graphs09,6cm}
@end ifhtml

Ejemplo 2:

@c ===beg===
@c load (graphs)$
@c g:create_graph(16,
@c     [
@c      [0,1],[1,3],[2,3],[0,2],[3,4],[2,4],
@c      [5,6],[6,4],[4,7],[6,7],[7,8],[7,10],[7,11],
@c      [8,10],[11,10],[8,9],[11,12],[9,15],[12,13],
@c      [10,14],[15,14],[13,14]
@c     ])$
@c t:minimum_spanning_tree(g)$
@c draw_graph(
@c     g,
@c     show_edges=edges(t),
@c     show_edge_width=4,
@c     show_edge_color=green,
@c     vertex_type=filled_square,
@c     vertex_size=2
@c     )$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) g:create_graph(16,
    [
     [0,1],[1,3],[2,3],[0,2],[3,4],[2,4],
     [5,6],[6,4],[4,7],[6,7],[7,8],[7,10],[7,11],
     [8,10],[11,10],[8,9],[11,12],[9,15],[12,13],
     [10,14],[15,14],[13,14]
    ])$
(%i3) t:minimum_spanning_tree(g)$
(%i4) draw_graph(
    g,
    show_edges=edges(t),
    show_edge_width=4,
    show_edge_color=green,
    vertex_type=filled_square,
    vertex_size=2
    )$
@end example

@ifhtml
@image{../figures/graphs10,6cm}
@end ifhtml

Ejemplo 3:

@c ===beg===
@c load (graphs)$
@c mi : max_independent_set(g)$
@c draw_graph(
@c     g,
@c     show_vertices=mi,
@c     show_vertex_type=filled_up_triangle,
@c     show_vertex_size=2,
@c     edge_color=cyan,
@c     edge_width=3,
@c     show_id=true,
@c     text_color=brown
@c     )$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) mi : max_independent_set(g)$
(%i3) draw_graph(
    g,
    show_vertices=mi,
    show_vertex_type=filled_up_triangle,
    show_vertex_size=2,
    edge_color=cyan,
    edge_width=3,
    =true,
    text_color=brown
    )$
@end example

@ifhtml
@image{../figures/graphs11,6cm}
@end ifhtml

Ejemplo 4:

@c ===beg===
@c load (graphs)$
@c net : create_graph(
@c     [0,1,2,3,4,5],
@c     [
@c      [[0,1], 3], [[0,2], 2],
@c      [[1,3], 1], [[1,4], 3],
@c      [[2,3], 2], [[2,4], 2],
@c      [[4,5], 2], [[3,5], 2]
@c     ],
@c     directed=true
@c     )$
@c draw_graph(
@c     net,
@c     show_weight=true,
@c     vertex_size=0,
@c     show_vertices=[0,5],
@c     show_vertex_type=filled_square,
@c     head_length=0.2,
@c     head_angle=10,
@c     edge_color="dark-green",
@c     text_color=blue
@c     )$
@c ===end===
@example
(%i1) load (graphs)$
(%i2) net : create_graph(
    [0,1,2,3,4,5],
    [
     [[0,1], 3], [[0,2], 2],
     [[1,3], 1], [[1,4], 3],
     [[2,3], 2], [[2,4], 2],
     [[4,5], 2], [[3,5], 2]
    ],
    directed=true
    )$
(%i3) draw_graph(
    net,
    show_weight=true,
    vertex_size=0,
    show_vertices=[0,5],
    show_vertex_type=filled_square,
    head_length=0.2,
    head_angle=10,
    edge_color="dark-green",
    text_color=blue
    )$
@end example

@ifhtml
@image{../figures/graphs12,6cm}
@end ifhtml

Ejemplo 5:

@c ===beg===
@c load(graphs)$
@c g: petersen_graph(20, 2);
@c draw_graph(g, redraw=true, program=planar_embedding);
@c ===end===
@example
(%i1) load(graphs)$
(%i2) g: petersen_graph(20, 2);
(%o2)                         GRAPH
(%i3) draw_graph(g, redraw=true, program=planar_embedding);
(%o3)                         done
@end example

@ifhtml
@image{../figures/graphs14,6cm}
@end ifhtml

Ejemplo 6:

@c ===beg===
@c load(graphs)$
@c t: tutte_graph();
@c draw_graph(t, redraw=true, 
@c               fixed_vertices=[1,2,3,4,5,6,7,8,9]);
@c ===end===
@example
(%i1) load(graphs)$
(%i2) t: tutte_graph();
(%o2)                         GRAPH
(%i3) draw_graph(t, redraw=true, 
                    fixed_vertices=[1,2,3,4,5,6,7,8,9]);
(%o3)                         done
@end example

@ifhtml
@image{../figures/graphs15,6cm}
@end ifhtml

@end deffn


@defvr {Variable opcional} draw_graph_program
Valor por defecto: @var{spring_embedding}

Programa a utilizar por defecto para posicionar los vértices en la función @code{draw_graph}.
@end defvr

@defvr {Opción de draw_graph} show_id
Valor por defecto: @var{false}

Si @var{show_id} vale @var{true} entonces se muestran los
números identificadores de los vértices.
@end defvr

@defvr {Opción de draw_graph} show_label
Valor por defecto: @var{false}

Si @var{show_label} vale @var{true} entonces se muestran las
etiquetas de los vértices.
@end defvr

@defvr {Opción de draw_graph} label_alignment
Valor por defecto: @var{center}

Indica cómo se deben alinear las etiquetas o números
identificadores de los vértices. Puede ser: @code{left}, @code{center} or @code{right}.
@end defvr

@defvr {Opción de draw_graph} show_weight 
Valor por defecto: @var{false}

si @var{show_weight} vale @var{true} entonces se mostrarán 
los pesos de las aristas.
@end defvr

@defvr {Opción de draw_graph} vertex_type
Valor por defecto: @var{circle}

Establece cómo se mostrarán los vértices. Véase la
opción @var{point_type} del paquete @code{draw}.
@end defvr

@defvr {Opción de draw_graph} vertex_size
Tamanõ de los vértices.
@end defvr

@defvr {Opción de draw_graph} vertex_color
Color a utilizar en los vértices.
@end defvr

@defvr {Opción de draw_graph} show_vertices
Valor por defecto: []

Dibuja los vértices seleccionados en la lista con colores diferentes.
@end defvr

@defvr {Opción de draw_graph} show_vertex_type
Establece cómo se mostrarán los vértices de
@var{show_vertices}. Véase la opción @var{point_type} del paquete @code{draw}.
@end defvr

@defvr {Opción de draw_graph} show_vertex_size
Tamanõs de los vértices de @var{show_vertices}.
@end defvr

@defvr {Opción de draw_graph} show_vertex_color 
Color a utilizar en los vértices de la lista @var{show_vertices}.
@end defvr

@defvr {Opción de draw_graph} vertex_partition
Valor por defecto: []

Una partición @code{[[v1,v2,...],...,[vk,...,vn]]} de los vértices del grafo. Los 
vértices de cada lista se dibujarán de diferente color.
@end defvr

@defvr {Opción de draw_graph} vertex_coloring
Colores de los vértices. Los colores @var{col} deben
especificarse en el mismo formato que el devuelto por @var{vertex_coloring}.
@end defvr

@defvr {Opción de draw_graph} edge_color 
Color a utilizar en las aristas.
@end defvr

@defvr {Opción de draw_graph} edge_width
Ancho de las aristas.
@end defvr

@defvr {Opción de draw_graph} edge_type
Establece cómo se dibujarán las aristas. Véase la opción
@var{line_type} del paquete @code{draw}.
@end defvr

@defvr {Opción de draw_graph} show_edges
Dibuja las aristas de la lista @var{e_list} con colores diferentes.
@end defvr

@defvr {Opción de draw_graph} show_edge_color
Color a utilizar en las aristas de la lista @var{show_edges}.
@end defvr

@defvr {Opción de draw_graph} show_edge_width
Anchos de las aristas de @var{show_edges}.
@end defvr

@defvr {Opción de draw_graph} show_edge_type
Establece cómo se dibujarán las aristas de @var{show_edges}.
Véase la opción @var{line_type} del paquete @code{draw}.
@end defvr

@defvr {Opción de draw_graph} edge_partition
Una partición @code{[[e1,e2,...],...,[ek,...,em]]} de las aristas del grafo.
Las aristas de cada lista se dibujarán de diferente color.
@end defvr

@defvr {Opción de draw_graph} edge_coloring
Colores de las aristas. Los colores @var{col} deben
especificarse en el mismo formato que el devuelto por @var{edge_coloring}.
@end defvr

@defvr {Opción de draw_graph} redraw 
Valor por defecto: @var{false}

Si @var{redraw} vale @code{true}, las posiciones de los vértices se recalculan
incluso si las posiciones están almacenadas de un dibujo previo del grafo.
@end defvr

@defvr {Opción de draw_graph} head_angle
Valor por defecto: 15

Ángulo de las flechas de los arcos en los grafos orientados.
@end defvr

@defvr {Opción de draw_graph} head_length
Valor por defecto: 0.1

Longitud de las flechas de los arcos en los grafos orientados.
@end defvr

@defvr {Opción de draw_graph} spring_embedding_depth
Valor por defecto: 50

Número de iteraciones del algoritmo de dibujo de grafos.
@end defvr

@defvr {Opción de draw_graph} terminal
Terminal utilizado para ver el gráfo. Véase la opción @var{terminal}
del paquete @code{draw}.
@end defvr

@defvr {Opción de draw_graph} file_name
Nombre del fichero cuando el terminal especificado no es la pantalla.
@end defvr

@defvr {Opción de draw_graph} program
establece el programa para posicionado de vértices del grafo. Puede ser
cualquiera de los programas graphviz (dot, neato, twopi, circ, fdp), @var{circular} o
@var{spring_embedding} o @var{planar_embedding}; @var{planar_embedding} s@'lo está
disponible para grafos planares 2-conectados. Si @code{program=spring_embedding},
se puede especificar un conjunto de vértices de posición fija con la opción 
@var{fixed_vertices}.
@end defvr

@defvr {Opción de draw_graph} fixed_vertices
Especifica una lista de vértices con posiciones fijas en
un polígono regular. Se puede utilizar cuando @code{program=spring_embedding}.
@end defvr

@deffn {Función} vertices_to_path (@var{v_list})
Convierte una lista @var{v_list} de vértices en la lista de aristas del camino
definido por la propia @var{v_list}.
@end deffn

@deffn {Función} vertices_to_cycle (@var{v_list})
Convierte una lista @var{v_list} de vértices en la lista de aristas del ciclo
definido por la propia @var{v_list}.
@end deffn



