aboutsummaryrefslogtreecommitdiff
path: root/aed1/n4.lyx
diff options
context:
space:
mode:
authorJuan Marín Noguera <juan.marinn@um.es>2020-02-20 20:21:46 +0100
committerJuan Marín Noguera <juan.marinn@um.es>2020-02-20 20:21:46 +0100
commit1f7f9bcc7660fba0827a62c3068d5c7082f025d7 (patch)
tree401c12eaea057e9eb99579c05703906cfaad156c /aed1/n4.lyx
parentc4c9556bc4a235f413edda917fdc683cd57390f7 (diff)
Otras dos asignaturas
Diffstat (limited to 'aed1/n4.lyx')
-rw-r--r--aed1/n4.lyx3547
1 files changed, 3547 insertions, 0 deletions
diff --git a/aed1/n4.lyx b/aed1/n4.lyx
new file mode 100644
index 0000000..db68fda
--- /dev/null
+++ b/aed1/n4.lyx
@@ -0,0 +1,3547 @@
+#LyX 2.3 created this file. For more info see http://www.lyx.org/
+\lyxformat 544
+\begin_document
+\begin_header
+\save_transient_properties true
+\origin unavailable
+\textclass book
+\use_default_options true
+\maintain_unincluded_children false
+\language spanish
+\language_package default
+\inputencoding auto
+\fontencoding global
+\font_roman "default" "default"
+\font_sans "default" "default"
+\font_typewriter "default" "default"
+\font_math "auto" "auto"
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100 100
+\font_tt_scale 100 100
+\use_microtype false
+\use_dash_ligatures true
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry false
+\use_package amsmath 1
+\use_package amssymb 1
+\use_package cancel 1
+\use_package esint 1
+\use_package mathdots 1
+\use_package mathtools 1
+\use_package mhchem 1
+\use_package stackrel 1
+\use_package stmaryrd 1
+\use_package undertilde 1
+\cite_engine basic
+\cite_engine_type default
+\biblio_style plain
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\justification true
+\use_refstyle 1
+\use_minted 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\is_math_indent 0
+\math_numbering_side default
+\quotes_style french
+\dynamic_quotes 0
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Standard
+Un
+\series bold
+grafo dirigido
+\series default
+ o
+\series bold
+digrafo
+\series default
+ es un par
+\begin_inset Formula $(V,E)$
+\end_inset
+
+ formado por un conjunto de
+\series bold
+vértices
+\series default
+ o
+\series bold
+nodos
+\series default
+
+\begin_inset Formula $V\neq\emptyset$
+\end_inset
+
+ y un conjunto de
+\series bold
+aristas
+\series default
+
+\begin_inset Formula $E\subseteq\{(a,b)\in V\times V:a\neq b\}$
+\end_inset
+
+, mientras que uno
+\series bold
+no dirigido
+\series default
+ es un par
+\begin_inset Formula $(V,E)$
+\end_inset
+
+ con
+\begin_inset Formula $V\neq\emptyset$
+\end_inset
+
+ y
+\begin_inset Formula $E\subseteq\{x\in{\cal P}(V):|x|=2\}$
+\end_inset
+
+.
+ Algunas definiciones permiten
+\series bold
+bucles
+\series default
+, aristas de un nodo a sí mismo, y entonces basta que sea
+\begin_inset Formula $E\subseteq V\times V$
+\end_inset
+
+ para que el grafo sea dirigido o que
+\begin_inset Formula $E\subseteq\{x\in{\cal P}(V):|x|\in\{1,2\}\}$
+\end_inset
+
+ para que sea no dirigido.
+ En adelante identificamos los grafos no dirigidos
+\begin_inset Formula $(V,E)$
+\end_inset
+
+ con los correspondientes grafos dirigidos
+\begin_inset Formula $(V,\bigcup_{\{u,v\}\in E}\{(u,v),(v,u)\})$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+Un
+\series bold
+grafo etiquetado
+\series default
+ es una terna
+\begin_inset Formula $(V,E,\sigma)$
+\end_inset
+
+ donde
+\begin_inset Formula $(V,E)$
+\end_inset
+
+ es un grafo (dirigido o no) y
+\begin_inset Formula $\sigma:E\rightarrow X$
+\end_inset
+
+ es una función que relaciona cada arista con una
+\series bold
+etiqueta
+\series default
+.
+ Un
+\series bold
+grafo con pesos
+\series default
+ es un grafo etiquetado
+\begin_inset Formula $(V,E,\sigma)$
+\end_inset
+
+ con
+\begin_inset Formula $\sigma:E\rightarrow\mathbb{R}$
+\end_inset
+
+.
+ Un grafo es
+\series bold
+finito
+\series default
+ si
+\begin_inset Formula $V$
+\end_inset
+
+ lo es.
+\end_layout
+
+\begin_layout Standard
+Un
+\series bold
+subgrafo
+\series default
+ de un grafo
+\begin_inset Formula $G:=(V,E)$
+\end_inset
+
+ es un grafo
+\begin_inset Formula $(V',E')$
+\end_inset
+
+ con
+\begin_inset Formula $V'\subseteq V$
+\end_inset
+
+ y
+\begin_inset Formula $E'\subseteq E$
+\end_inset
+
+.
+ Un subgrafo de un grafo etiquetado
+\begin_inset Formula $G:=(V,E,\sigma)$
+\end_inset
+
+ es un grafo etiquetado
+\begin_inset Formula $(V',E',\sigma|_{E'})$
+\end_inset
+
+ donde
+\begin_inset Formula $(V',E')$
+\end_inset
+
+ es subgrafo de
+\begin_inset Formula $(V,E)$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+Un nodo
+\begin_inset Formula $u\in V$
+\end_inset
+
+ es
+\series bold
+adyacente a
+\series default
+
+\begin_inset Formula $v\in V$
+\end_inset
+
+ si
+\begin_inset Formula $(v,u)\in E$
+\end_inset
+
+, y es
+\series bold
+adyacente de
+\series default
+
+\begin_inset Formula $v$
+\end_inset
+
+ si
+\begin_inset Formula $(u,v)\in E$
+\end_inset
+
+.
+ Un
+\series bold
+camino
+\series default
+ de
+\begin_inset Formula $u$
+\end_inset
+
+ a
+\begin_inset Formula $v$
+\end_inset
+
+ es una secuencia
+\begin_inset Formula $(w_{1},\dots,w_{q})$
+\end_inset
+
+ de elementos de
+\begin_inset Formula $V$
+\end_inset
+
+ con
+\begin_inset Formula $(w_{i-1},w_{i})\in E\forall i\in\{2,\dots,q\}$
+\end_inset
+
+, y es
+\series bold
+simple
+\series default
+ si para
+\begin_inset Formula $i,j\in\{1,\dots,q\}$
+\end_inset
+
+ con
+\begin_inset Formula $i\neq j$
+\end_inset
+
+ e
+\begin_inset Formula $\{i,j\}\neq\{1,q\}$
+\end_inset
+
+ se tiene
+\begin_inset Formula $w_{i}\neq w_{j}$
+\end_inset
+
+.
+ Si
+\begin_inset Formula $w_{1}=w_{q}$
+\end_inset
+
+, el camino es un
+\series bold
+ciclo
+\series default
+.
+ Un grafo es
+\series bold
+acíclico
+\series default
+ si no contiene ciclos.
+\end_layout
+
+\begin_layout Standard
+Es
+\series bold
+conexo
+\series default
+ o
+\series bold
+conectado
+\series default
+ si existe un camino entre cualquier par de vértices, y es
+\series bold
+fuertemente conexo
+\series default
+ si además es dirigido.
+ Un
+\series bold
+componente conexo
+\series default
+ de un grafo (también
+\series bold
+fuertemente conexo
+\series default
+ si el grafo es dirigido) es un subgrafo conexo que no es subgrafo de ningún
+ otro subgrafo conexo del grafo.
+\end_layout
+
+\begin_layout Standard
+Un grafo es
+\series bold
+completo
+\series default
+ si existe una arista entre cualquier par de vértices.
+ En un grafo no dirigido
+\begin_inset Formula $(V,E)$
+\end_inset
+
+, el
+\series bold
+grado
+\series default
+ de un vértice
+\begin_inset Formula $v\in V$
+\end_inset
+
+ es el número de arcos adyacentes a él (
+\begin_inset Formula $|\{X\in E:v\in X\}|$
+\end_inset
+
+), mientras que en uno dirigido
+\begin_inset Formula $(V,A)$
+\end_inset
+
+, definimos el
+\series bold
+grado de entrada
+\series default
+ de un vértice
+\begin_inset Formula $v\in V$
+\end_inset
+
+ como
+\begin_inset Formula $|\{(a,b)\in A:b=v\}|$
+\end_inset
+
+ y el
+\series bold
+grado de salida
+\series default
+ como
+\begin_inset Formula $|\{(a,b)\in A:a=v\}|$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+Operaciones elementales:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula
+\[
+\begin{array}{rr}
+\mathsf{Vacío}:\rightarrow G & \mathsf{Crear}:\mathbb{N}\rightarrow G\\
+\mapsto(\emptyset,\emptyset) & n\mapsto(\{1,\dots,n\},\emptyset)\\
+\\
+\mathsf{IntertarNodo}:G\times{\cal U}\rightarrow G & \mathsf{InsertarArista}:G\times({\cal U}\times{\cal U})\rightarrow G\\
+((V,E),v)\mapsto(V\cup\{v\},E) & ((V,E),(a,b))\overset{a,b\in V}{\mapsto}(V,E\cup\{e\})\\
+\\
+\mathsf{EliminarNodo}:G\times{\cal U}\rightarrow G & \mathsf{EliminarArista}:G\times({\cal U}\times{\cal U})\rightarrow G\\
+((V,E),v)\mapsto(V\backslash\{e\},\{(a,b)\in E:a,b\neq v\}) & ((V,E),e)\mapsto(V,E\backslash\{e\})\\
+\\
+\mathsf{ConsultarArista}:G\times({\cal U}\times{\cal U})\rightarrow B\\
+((V,E),(a,b))\mapsto(a,b)\in A
+\end{array}
+\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Donde
+\begin_inset Formula ${\cal U}$
+\end_inset
+
+ es el conjunto de los vértices.
+ Definimos también iteradores sobre los nodos adyacentes a un cierto
+\begin_inset Formula $v\in V$
+\end_inset
+
+ o adyacentes de este.
+\end_layout
+
+\begin_layout Section
+Representación
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+ filename graph.svg
+ scale 60
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption Standard
+
+\begin_layout Plain Layout
+Grafo no dirigido.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Podemos dibujar un grafo indicando los nodos mediante círculos con etiqueta
+ (o cualquier otra forma) y uniendo con una línea los vértices de cada arista.
+ Si el grafo es dirigido, cada línea es una flecha que apunta al segundo
+ elemento del par.
+ Si es etiquetado, cada línea tendrá su etiqueta indicada.
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+begin{sloppypar}
+\end_layout
+
+\end_inset
+
+En un ordenador podemos representar un grafo finito
+\begin_inset Formula $(V:=\{1,\dots,n\},E)$
+\end_inset
+
+ o
+\begin_inset Formula $(V:=\{1,\dots,n\},E,\sigma:E\rightarrow X)$
+\end_inset
+
+ mediante:
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+end{sloppypar}
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Matrices de adyacencia
+\series default
+: Matriz
+\begin_inset Formula $n\times n$
+\end_inset
+
+ de booleanos
+\begin_inset Formula $((i,j)\in E)_{ij}$
+\end_inset
+
+.
+ Si el grafo es etiquetado, cuando
+\begin_inset Formula $(i,j)\in E$
+\end_inset
+
+ se añade en la celda la etiqueta, lo que en general se hace tomando un
+ valor
+\begin_inset Formula $c\notin X$
+\end_inset
+
+ que representa que
+\begin_inset Formula $(i,j)\notin E$
+\end_inset
+
+ y entendiendo que cualquier otro valor implica
+\begin_inset Formula $(i,j)\in E$
+\end_inset
+
+.
+ Si el grafo es no dirigido, la matriz es simétrica.
+ Las operaciones son sencillas y el acceso a una arista dada es
+\begin_inset Formula $O(1)$
+\end_inset
+
+, pero si
+\begin_inset Formula $|E|\ll n^{2}$
+\end_inset
+
+ (
+\series bold
+matriz escasa
+\series default
+) se usa mucha memoria (
+\begin_inset Formula $O(n^{2})$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Listas de adyacencia
+\series default
+:
+\begin_inset Formula $n$
+\end_inset
+
+ conjuntos
+\begin_inset Formula $(C_{1},\dots,C_{n})$
+\end_inset
+
+ (representados como listas enlazadas en una lista contigua) de los que
+
+\begin_inset Formula $C_{i}=\{j:(i,j)\in E\}$
+\end_inset
+
+.
+ Si el grafo es etiquetado,
+\begin_inset Formula $C_{i}=\{(j,\sigma(i,j)):(i,j)\in E\}$
+\end_inset
+
+.
+ Esto es más adecuado si
+\begin_inset Formula $|E|\ll n^{2}$
+\end_inset
+
+, pues la memoria usada es
+\begin_inset Formula $O(n+|E|)$
+\end_inset
+
+, pero la representación es más compleja y es ineficiente para encontrar
+ las aristas adyacentes de un cierto nodo.
+\end_layout
+
+\begin_layout Standard
+En adelante, salvo que se indique lo contrario, suponemos un grafo
+\begin_inset Formula $(V:=\{1,\dots,n\},E,\sigma:E\rightarrow X)$
+\end_inset
+
+, y que las variables en pseudocódigo se inicializan con su valor por defecto.
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+Para
+\family sans
+booleano
+\family default
+ es
+\family sans
+falso
+\family default
+; para
+\family sans
+entero
+\family default
+,
+\family sans
+real
+\family default
+ y
+\begin_inset Formula $[0,+\infty]$
+\end_inset
+
+ es
+\family sans
+0
+\family default
+; para
+\family sans
+\series bold
+array
+\family default
+\series default
+s y
+\family sans
+\series bold
+registro
+\family default
+\series default
+s se inicializa con el valor por defecto de cada campo; para tipos contenedor
+ se crea una instancia vacía, y para
+\family sans
+RelEquiv
+\family default
+ las clases de equivalencia son de un solo elemento.
+ Las variables del resto de tipos no se inicializan por defecto.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Recorridos
+\end_layout
+
+\begin_layout Standard
+Ambos son
+\begin_inset Formula $O(|V|^{2})$
+\end_inset
+
+ con matrices de adyacencia y
+\begin_inset Formula $O(|V|+|E|)$
+\end_inset
+
+ con listas de adyacencia.
+\end_layout
+
+\begin_layout Subsubsection*
+
+\series bold
+Búsqueda primero en profundidad
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ visitado:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+ de
+\series default
+ booleano()
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+operación
+\series default
+ dfs(u: [1..n])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+visitado[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ verdadero; visitar(u)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para cada
+\series default
+ nodo v adyacente a u
+\series bold
+hacer si no
+\series default
+ visitado[v]
+\series bold
+entonces
+\series default
+ dfs(u)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para
+\series default
+ i
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer si no
+\series default
+visitado[i]
+\series bold
+entonces
+\series default
+ dfs(i)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Podemos ver el órden de visita de unos nodos a otros como un
+\series bold
+árbol de expansión en profundidad
+\series default
+ asociado al grafo o, si aparecen varios árboles, como un
+\series bold
+bosque de expansión en profundidad
+\series default
+.
+ Para construirlo, hacemos que cada elemento de
+\family sans
+visitado
+\family default
+ pueda almacenar un valor
+\family sans
+[1..n]
+\family default
+ indicando el padre del nodo, lo que nos permite encontrar los componentes
+ conexos de un grafo no dirigido.
+ Decimos que
+\begin_inset Formula $(a,b)\in E$
+\end_inset
+
+ es:
+\end_layout
+
+\begin_layout Itemize
+Un
+\series bold
+arco de avance
+\series default
+ si
+\begin_inset Formula $a$
+\end_inset
+
+ es padre a
+\begin_inset Formula $b$
+\end_inset
+
+ en uno de los árboles del bosque.
+\end_layout
+
+\begin_layout Itemize
+Un
+\series bold
+arco de retroceso
+\series default
+ si
+\begin_inset Formula $a$
+\end_inset
+
+ es hijo de
+\begin_inset Formula $b$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+Un
+\series bold
+arco de cruce
+\series default
+ si no es de avance ni de retroceso.
+\end_layout
+
+\begin_layout Standard
+Un grafo no dirigido contiene un ciclo si y sólo si algún arco no está en
+ el árbol de expansión.
+ Un grafo dirigido contiene un ciclo si y sólo si algún arco es de retroceso.
+\end_layout
+
+\begin_layout Subsubsection*
+Búsqueda primero en anchura o amplitud
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ visitado:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ booleano
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+C: Cola[[1..n]]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+operación
+\series default
+ bfs(u: [1..n])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+visitado[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ verdadero; C.meter(u); visitar(u)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+mientras no
+\series default
+ C.vacía
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+v
+\begin_inset Formula $:=$
+\end_inset
+
+ C.cabeza; C.sacar
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para cada
+\series default
+ nodo w adyacente a v
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si no
+\series default
+ visitado[w]
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+visitado[w]
+\begin_inset Formula $:=$
+\end_inset
+
+ verdadero; C.meter(w); visitar(w)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para
+\series default
+ i
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer si no
+\series default
+ visitado[i]
+\series bold
+entonces
+\series default
+ bfs(i)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Árboles de expansión mínimos
+\end_layout
+
+\begin_layout Standard
+Un
+\series bold
+árbol de expansión
+\series default
+ de un grafo no dirigido y conexo es un subgrafo acíclico conexo.
+ El
+\series bold
+coste
+\series default
+ de un grafo con pesos
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+En general, de un grafo etiquetado por elementos de algún grupo.
+\end_layout
+
+\end_inset
+
+ es la suma de los costes de las aristas.
+ Los siguientes algoritmos obtienen coste del árbol de expansión de coste
+ mínimo de un grafo, donde la variable
+\family sans
+coste
+\family default
+ contiene dicho coste.
+\end_layout
+
+\begin_layout Subsubsection*
+Algoritmo de Prim
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ visitado:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ booleano
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+C: ColaPrioridad[
+\series bold
+registro
+\series default
+ coste: real; nodo: [1..n]]
+\begin_inset Formula $//$
+\end_inset
+
+
+\emph on
+A menor coste, mayor prioridad
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+coste: real
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+operación
+\series default
+ procesar(u: [1..n])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+visitado[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ verdadero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para cada
+\series default
+ nodo v adyancente a u con peso w
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si no
+\series default
+ visitado[v]
+\series bold
+entonces
+\series default
+ C.meter((w, v))
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+procesar(0)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+mientras no
+\series default
+ C.vacía
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+p
+\begin_inset Formula $:=$
+\end_inset
+
+ C.cabeza; C.sacar
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si no
+\series default
+ visitado(p.nodo)
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+coste
+\begin_inset Formula $:=$
+\end_inset
+
+ coste
+\begin_inset Formula $+$
+\end_inset
+
+ p.coste
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+procesar(p.nodo)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Como introducir y extraer elementos de la cola de prioridad es
+\begin_inset Formula $O(\log n)$
+\end_inset
+
+, siendo
+\begin_inset Formula $n$
+\end_inset
+
+ el total de elementos de la cola que será proporcional a
+\begin_inset Formula $|E|$
+\end_inset
+
+, el algoritmo se ejecuta en
+\begin_inset Formula $O(|E|\log|E|)$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsubsection*
+Algoritmo de Kruskal
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ RE: RelEquiv[[1..n]]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+coste: real
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para cada
+\series default
+ arista (u, v) con peso w ordenadas por peso ascendente
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ RE.encuentra(u)
+\begin_inset Formula $\ne$
+\end_inset
+
+ RE.encuentra(v)
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+coste
+\begin_inset Formula $:=$
+\end_inset
+
+ coste
+\begin_inset Formula $+$
+\end_inset
+
+ w
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+RE.unión(u, v)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+El algoritmo se ejecuta en
+\begin_inset Formula $O(|E|\log|E|)$
+\end_inset
+
+, pues es lo que se tarda en ordenar las aristas.
+\end_layout
+
+\begin_layout Section
+Caminos mínimos
+\end_layout
+
+\begin_layout Standard
+El coste de un camino es la suma de los costes de las aristas por las que
+ pasa, y el
+\series bold
+camino mínimo
+\series default
+ entre dos nodos es el que tiene menor coste de entre los que empiezan en
+ el primero y terminan en el segundo.
+\end_layout
+
+\begin_layout Standard
+El
+\series bold
+algoritmo de Dijkstra
+\series default
+ obtiene el mínimo coste del camino de cierto nodo (que supondremos que
+ es el 1) y todos los demás.
+ Para ello trabaja con un conjunto de nodos
+\series bold
+escogidos
+\series default
+, para los cuales se conoce ya el camino mínimo desde el origen, y otro
+ de
+\series bold
+candidatos
+\series default
+, de los que no sabemos el camino mínimo salvo si nos restringimos a
+\series bold
+caminos especiales
+\series default
+, los que pasan solo por nodos escogidos (más él mismo al final).
+ En cada paso el algoritmo toma el nodo candidato con menor distancia al
+ origen, lo añade a los candidatos y recalcula los caminos mínimos del resto
+ de candidatos.
+ Tras repetir esto
+\begin_inset Formula $n-1$
+\end_inset
+
+ veces, el camino mínimo de cada nodo coincide con su camino especial.
+ La siguiente versión del algoritmo funciona con una matriz de adyacencia
+
+\family sans
+C
+\family default
+ que usa
+\begin_inset Formula $+\infty$
+\end_inset
+
+ para indicar la ausencia de arista:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ coste:
+\series bold
+array
+\series default
+ [2..n]
+\series bold
+de
+\begin_inset Formula $\mathsf{real}\cup\{+\infty\}$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+paso:
+\series bold
+array
+\series default
+ [2..n]
+\series bold
+de
+\series default
+ [1..n]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+escogido:
+\series bold
+array
+\series default
+ [2..n]
+\series bold
+de
+\series default
+ booleano
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para
+\series default
+ i
+\begin_inset Formula $:=$
+\end_inset
+
+ 2
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+coste[i]
+\begin_inset Formula $:=$
+\end_inset
+
+ C[1, i]; paso[i]
+\begin_inset Formula $:=$
+\end_inset
+
+ 1; escogido[v]
+\begin_inset Formula $:=$
+\end_inset
+
+ falso
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para
+\series default
+ i
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\begin_inset Formula $-$
+\end_inset
+
+1
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+u
+\begin_inset Formula $:=$
+\end_inset
+
+ i
+\series bold
+si no
+\series default
+ escogido[i]
+\series bold
+minimizando
+\series default
+ coste[i]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+escogido[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ verdadero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para cada
+\series default
+ nodo v adyacente a u
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si no
+\series default
+ escogido[v]
+\series bold
+y
+\series default
+ coste[u]
+\begin_inset Formula $+$
+\end_inset
+
+ C[u, v]
+\begin_inset Formula $<$
+\end_inset
+
+ coste[v]
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+coste[v]
+\begin_inset Formula $:=$
+\end_inset
+
+ coste[u]
+\begin_inset Formula $+$
+\end_inset
+
+ C[u, v]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+paso[v]
+\begin_inset Formula $:=$
+\end_inset
+
+ u
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+El algoritmo almacena en
+\family sans
+coste[i]
+\family default
+ el coste del camino mínimo del nodo
+\family sans
+1
+\family default
+ al
+\family sans
+i
+\family default
+, y en
+\family sans
+paso[i]
+\family default
+ el vértice que precede a
+\family sans
+i
+\family default
+ en este camino, con lo que accediendo sucesivamente podemos encontrar el
+ camino mínimo
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+Los caminos mínimos desde un único nodo al resto forman una estructura de
+ árbol.
+\end_layout
+
+\end_inset
+
+.
+ Si solo necesitamos el coste, podemos omitir del algoritmo la obtención
+ del camino.
+\end_layout
+
+\begin_layout Standard
+Esta implementación ejecuta
+\begin_inset Formula $n-1$
+\end_inset
+
+ veces un código que busca un mínimo de entre
+\begin_inset Formula $n$
+\end_inset
+
+ valores y actualiza hasta
+\begin_inset Formula $n$
+\end_inset
+
+ candidatos, luego en total el algoritmo se ejecuta en
+\begin_inset Formula $O(|V|^{2})$
+\end_inset
+
+.
+ Otra versión con listas de adyacencia consigue llegar a
+\begin_inset Formula $O(|E|\log|V|)$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+Para los caminos mínimos entre todos los pares, aplicamos el
+\series bold
+algoritmo de
+\color pink
+Floyd
+\series default
+\color inherit
+:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ coste:
+\series bold
+array
+\series default
+ [1..n, 1..n]
+\series bold
+de
+\series default
+
+\begin_inset Formula $\mathsf{real}\cup\{+\infty\}$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+paso:
+\series bold
+array
+\series default
+ [1..n, 1..n]
+\series bold
+de
+\series default
+ [1..n]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+coste
+\begin_inset Formula $:=$
+\end_inset
+
+ C
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para
+\series default
+ k
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para
+\series default
+ i
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para
+\series default
+ j
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ coste[i, k]
+\begin_inset Formula $+$
+\end_inset
+
+ coste[k, j]
+\begin_inset Formula $<$
+\end_inset
+
+ coste[i, j]
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+coste[i, j]
+\begin_inset Formula $:=$
+\end_inset
+
+ coste[i, k]
+\begin_inset Formula $+$
+\end_inset
+
+ coste[k, j]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+paso[i, j]
+\begin_inset Formula $:=$
+\end_inset
+
+ k
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Este algoritmo
+\begin_inset Formula $O(n^{3})$
+\end_inset
+
+ funciona hallando, en cada iteración del bucle externo, los caminos mínimos
+ pasando por un máximo de
+\begin_inset Formula $k$
+\end_inset
+
+ vértices.
+ El camino de un vértice
+\family sans
+a
+\family default
+ a otro
+\family sans
+b
+\family default
+ distintos se obtiene como el camino mínimo de
+\family sans
+a
+\family default
+ a
+\family sans
+paso[a, b]
+\family default
+ y aquí a
+\family sans
+b
+\family default
+.
+\end_layout
+
+\begin_layout Standard
+El
+\series bold
+algoritmo de Warshall
+\series default
+ permite obtener el
+\series bold
+cierre transitivo
+\series default
+ de un grafo, una matriz de booleanos
+\begin_inset Formula $(a_{ij}:=\text{existe un camino de \ensuremath{i} a \ensuremath{j}})$
+\end_inset
+
+, y es similar al de Floyd pero cambiando la condición dentro de los bucles
+ por
+\family sans
+A[i, j]
+\begin_inset Formula $:=$
+\end_inset
+
+ A[i, j]
+\series bold
+o
+\series default
+ (A[i, k]
+\series bold
+y
+\series default
+ A[k, j])
+\family default
+.
+\end_layout
+
+\begin_layout Section
+Componentes fuertemente conexos
+\end_layout
+
+\begin_layout Standard
+Para hallarlos, usamos el
+\series bold
+algoritmo de Tarjan
+\series default
+:
+\end_layout
+
+\begin_layout Enumerate
+Hacer búsqueda en profundidad del grafo numerando los vértices.
+\end_layout
+
+\begin_layout Enumerate
+Construir el grafo invertido:
+\begin_inset Formula $(V,E)\mapsto(V,\{(b,a)\}_{(a,b)\in E})$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Enumerate
+Hacer búsqueda en profundidad del grafo invertido, empezando en el nodo
+ con mayor número en el paso 1.
+ Mientras queden nodos por visitar, seguir con el nodo no visitado de mayor
+ número.
+\end_layout
+
+\begin_layout Enumerate
+Cada árbol del bosque resultante del paso 3 es un componente fuertemente
+ conexo.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ componentes: Conjunto[Conjunto[entero]]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+tiempo: entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+número:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+enlace:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+pila: Pila[[1..n]]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+apilado:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ booleano
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+operación
+\series default
+ tarjan(u: [1..n])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+número[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ tiempo; enlace[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ tiempo
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+tiempo
+\begin_inset Formula $:=$
+\end_inset
+
+ tiempo
+\begin_inset Formula $+$
+\end_inset
+
+ 1
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+pila.insertar(u); apilado[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ verdadero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para cada
+\series default
+ nodo v adyacente a u
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ número[v]
+\begin_inset Formula $=$
+\end_inset
+
+ 0
+\series bold
+entonces
+\series default
+ tarjan(v)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ apilado[v]
+\series bold
+entonces
+\series default
+ enlace[u]
+\begin_inset Formula $=$
+\end_inset
+
+ mín(enlace[u], enlace[v])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ enlace[u]
+\begin_inset Formula $=$
+\end_inset
+
+ visitado[u]
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+s: Conjunto[entero]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+repetir
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+v
+\begin_inset Formula $:=$
+\end_inset
+
+ pila.tope; pila.sacar; apilado[v]
+\begin_inset Formula $:=$
+\end_inset
+
+ falso
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+s.inserta(v)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+mientras
+\series default
+ u
+\begin_inset Formula $\neq$
+\end_inset
+
+ v
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+componentes.inserta(s)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para
+\series default
+ i
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer
+\series default
+
+\series bold
+si
+\series default
+ número[i]
+\begin_inset Formula $=$
+\end_inset
+
+ 0
+\series bold
+entonces
+\series default
+ conectar(i)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Tras ejecutar el algoritmo,
+\family sans
+componentes
+\family default
+ es el conjunto de componentes conexos del grafo.
+ Llamamos
+\series bold
+grafo reducido
+\series default
+
+\begin_inset Formula $G_{R}:=(V_{R},E_{R})$
+\end_inset
+
+ de
+\begin_inset Formula $G:=(V,E)$
+\end_inset
+
+ al grafo dirigido acíclico dado por
+\begin_inset Formula $V_{R}:=\{\text{componentes fuertemente conexos de \ensuremath{G}}\}$
+\end_inset
+
+ y
+\begin_inset Formula $E_{R}:=\{(A,B)\in V_{R}:\exists a\in A,b\in B:(a,b)\in E\}$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+Los grafos dirigidos acíclicos sirven, por ejemplo, para representar órdenes
+ parciales.
+ El
+\series bold
+recorrido en orden topológico
+\series default
+ de un GDA es aquel en que un vértice solo se visita tras visitar todos
+ los nodos adyacentes a él.
+ La
+\series bold
+numeración en orden topológico
+\series default
+ consiste en numerar los nodos de un GDA de forma que, si
+\begin_inset Formula $a$
+\end_inset
+
+ es adyacente a
+\begin_inset Formula $b$
+\end_inset
+
+, el número asignado a
+\begin_inset Formula $a$
+\end_inset
+
+ es menor que el asignado a
+\begin_inset Formula $b$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ orden: Pila[[1..n]]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+visitado:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ booleano
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+operación
+\series default
+ numerar(u: [1..n])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+visitado[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ verdadero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para cada
+\series default
+ nodo v adyacente a u
+\series bold
+hacer si no
+\series default
+visitado[v]
+\series bold
+entonces
+\series default
+ numerar(v)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+orden.insertar(u)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para
+\series default
+ i
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer si no
+\series default
+ visitado[i]
+\series bold
+entonces
+\series default
+ numerar(i)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Esto guarda un orden topológico en la pila
+\family sans
+orden
+\family default
+ de forma que el elemento en la cima es el primero, el siguiente el segundo,
+ etc.
+\end_layout
+
+\begin_layout Section
+Grafos eulerianos
+\end_layout
+
+\begin_layout Standard
+Un
+\series bold
+punto de articulación
+\series default
+ de un grafo no dirigido es un vértice que, al eliminarlo del grafo (junto
+ a las aristas incidentes) se divide un componente conexo en dos o más.
+ Un grafo no dirigido es
+\series bold
+biconexo
+\series default
+ si no tiene puntos de articulación.
+ Un
+\series bold
+componente biconexo
+\series default
+ de un grafo es un subgrafo biconexo de este que no es subgrafo de otro
+ subgrafo biconexo.
+\end_layout
+
+\begin_layout Standard
+Un grafo tiene
+\series bold
+conectividad
+\series default
+
+\begin_inset Formula $k\in\mathbb{N}$
+\end_inset
+
+ si es necesario eliminar
+\begin_inset Formula $k$
+\end_inset
+
+ nodos para que el grafo no sea conexo, por lo que un grafo es biconexo
+ si tiene conectividad 2 o más.
+ El siguiente algoritmo busca puntos de articulación:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ tiempo: entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+raíz: entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+hijosRaíz: entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+número:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+enlace:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+padre:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+articulación:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ booleano
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+operación
+\series default
+ puntosArticulación(u: [1..n])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+número[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ tiempo; enlace[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ tiempo
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+tiempo
+\begin_inset Formula $:=$
+\end_inset
+
+ tiempo
+\begin_inset Formula $+$
+\end_inset
+
+ 1
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para cada
+\series default
+ nodo v adyacente a u
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ número[v]
+\begin_inset Formula $=$
+\end_inset
+
+ 0
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+padre[v]
+\begin_inset Formula $:=$
+\end_inset
+
+ u
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ u
+\begin_inset Formula $=$
+\end_inset
+
+ raíz
+\series bold
+entonces
+\series default
+hijosRaíz
+\begin_inset Formula $:=$
+\end_inset
+
+ hijosRaíz
+\begin_inset Formula $+$
+\end_inset
+
+ 1
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+puntosArticulación(v)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ enlace[v]
+\begin_inset Formula $\geq$
+\end_inset
+
+ número[u]
+\series bold
+entonces
+\series default
+ articulación[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ verdadero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+enlace[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ mín(enlace[u], enlace[v])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+sino si
+\series default
+ v
+\begin_inset Formula $\neq$
+\end_inset
+
+ padre(u)
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+enlace[u]
+\begin_inset Formula $:=$
+\end_inset
+
+ mín(enlace[u], número[v])
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+para
+\series default
+ i
+\begin_inset Formula $:=$
+\end_inset
+
+ 1
+\series bold
+hasta
+\series default
+ n
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ número[i]
+\begin_inset Formula $=$
+\end_inset
+
+ 0
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+raíz
+\begin_inset Formula $:=$
+\end_inset
+
+ i; hijosRaíz
+\begin_inset Formula $:=$
+\end_inset
+
+ 0; puntosArticulación(i)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+articulación[raíz]
+\begin_inset Formula $:=$
+\end_inset
+
+ hijosRaíz
+\begin_inset Formula $>$
+\end_inset
+
+ 1
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Un
+\series bold
+camino de Euler
+\series default
+ es aquel que visita todas las aristas exactamente una vez.
+ Si además es un ciclo, se llama
+\series bold
+circuito de Euler
+\series default
+.
+ Un grafo no dirigido tiene un circuito de Euler si y sólo si todos los
+ nodos tienen grado par y, tras eliminar los de grado 0, es conexo.
+ El siguiente algoritmo busca un ciclo de Euler, supuesto que exista, a
+ partir del vértice 1, supuesto que cada arista
+\family sans
+(u, v)
+\family default
+ tiene una marca
+\family sans
+disponible(u, v)
+\family default
+ que inicialmente está establecida a verdadero.
+ Insertar un elemento en un iterador lo inserta antes del elemento al que
+ apunta y devuelve un iterador al elemento insertado.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "100col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+var
+\series default
+ ciclo: Lista[entero]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+visitado:
+\series bold
+array
+\series default
+ [1..n]
+\series bold
+de
+\series default
+ booleano
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+v: entero
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+j: Iterador[Lista[entero]]
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\series bold
+operación
+\series default
+ circuito(i: Iterador[Lista[entero]], u: entero)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+para cada
+\series default
+ nodo v adyacente a u
+\series bold
+hacer
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\series bold
+si
+\series default
+ disponible(u, v)
+\series bold
+entonces
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+disponible(u, v)
+\begin_inset Formula $:=$
+\end_inset
+
+ falso; disponible(v, u)
+\begin_inset Formula $:=$
+\end_inset
+
+ falso
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+
+\begin_inset space \qquad{}
+\end_inset
+
+tour(i.insertar(u), v)
+\end_layout
+
+\begin_layout Plain Layout
+
+\family sans
+circuito(iterar(ciclo), 1)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+La idea es partir de un vértice, tomar una arista no visitada, añadirla
+ al ciclo y repetir el proceso partiendo de este nuevo vértice.
+\end_layout
+
+\begin_layout Section
+Otros problemas
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Flujo máximo
+\series default
+: Los nodos representan puntos de una red, las aristas son canales de comunicaci
+ón entre ellos y los pesos de estas son el caudal máximo que puede circular.
+ El problema es hallar el flujo (caudal) máximo que puede haber desde un
+ cierto nodo (origen) a otro (destino), con las restricciones de que la
+ suma del flujo que entra a cada nodo interior (no origen ni destino) debe
+ ser igual a la que sale y el flujo en cada arista no puede superar el máximo.
+\begin_inset Newline newline
+\end_inset
+
+Un posible algoritmo es encontrar un camino del origen al destino, sumar
+ al flujo el mínimo caudal de las aristas que lo forman, restar dicho flujo
+ de estas aristas y repetir hasta que no haya caminos con peso no nulo,
+ si bien esto no garantiza solución óptima.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Ciclo hamiltoniano
+\series default
+ o
+\series bold
+de Hamilton
+\series default
+: Es un ciclo simple que visita todos los nodos.
+ Determinar si existe en un grafo es un problema NP-completo, y en la práctica
+ se usan
+\series bold
+heurísticas
+\series default
+, soluciones aproximadas que pueden o no funcionar.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Problema del viajero
+\series default
+ o
+\series bold
+del viajante
+\series default
+: Dado un grafo no dirigido, completo y con pesos, encontrar el ciclo de
+ menor coste que pase por todos los nodos.
+ También es NP-completo, y podemos usar heurísticas, técnicas probabilísticas,
+ algoritmos genéticos, etc.
+ para obtener aproximaciones.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Coloración de grafos
+\series default
+: Asignar un color o etiqueta a cada nodo de forma que dos nodos unidos
+ por una arista no tengan el mismo color, usando un mínimo número de colores.
+ Es NP-completo.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Isomorfismo
+\series default
+: Dos grafos
+\begin_inset Formula $G:=(V,E)$
+\end_inset
+
+ y
+\begin_inset Formula $G':=(V',E')$
+\end_inset
+
+ son
+\series bold
+isomorfos
+\series default
+ si existe una biyección
+\begin_inset Formula $\sigma:V\rightarrow V'$
+\end_inset
+
+ tal que
+\begin_inset Formula $(v,w)\in E\iff(\sigma(v),\sigma(w))\in E'$
+\end_inset
+
+.
+ Determinar si existe es NP-completo.
+\end_layout
+
+\end_body
+\end_document