Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guillermo Durán
4 6
7
Definiciones básicas
4 6
7
Definiciones básicas
7
Definiciones básicas
7
Definiciones básicas
2 3
1
V (G ) = {1, 2, 3, 4, 5, 6, 7}
5 E (G ) = {(2, 1), (4, 2), (2, 7), (3, 5),
4 6 (5, 3), (3, 6), (6, 3), (4, 5), (4, 6), (7, 4),
(6, 5), (6, 7)}
n = 7; m = 12.
7
Definiciones básicas
2 3
1
N[1]
5
4 6
N(3)
7
Grado
2 3
1
5
d(2) = 3
4 6
7
Grado
2 3
1
5
d(2) = 3
4 6 δ(G ) = 1
∆(G ) = 4
7
Grado
2 3
1
El vértice 1 es aislado en G .
5
4 6
G
7
Grado
2 3
1
El vértice 1 es aislado en G .
5 El vértice 4 es universal en G − {1}.
4 6
G
7
Grado
2 3
1
El vértice 1 es aislado en G .
5 El vértice 4 es universal en G − {1}.
4 6
Si G es no trivial y tiene un vértice
aislado no puede tener también uno
G universal.
7
Grado
Teorema
P
v ∈V (G ) d(v ) = 2m.
Grado
Teorema
P
v ∈V (G ) d(v ) = 2m.
Teorema
P
v ∈V (G ) d(v ) = 2m.
Teorema
P
v ∈V (G ) d(v ) = 2m.
Teorema
P
v ∈V (G ) d(v ) = 2m.
Teorema
P
v ∈V (G ) d(v ) = 2m.
Teorema
P
v ∈V (G ) d(v ) = 2m.
Corolario
Todo grafo cúbico tiene un número par de vértices.
Grado
Corolario
Todo grafo cúbico tiene un número par de vértices.
2
P
Demo: 2m = v ∈V (G ) d(v ) = 3n. Luego 2 | n.
Complemento
2 3 2 3
1 1
5 5
4 6 4 6
7 7
Subgrafos
2 3 5
1
7
5 1
4 6 2
6
3
7 G 4 H
Isomorfismo
2 3 5
1
7
f (1) = 7
f (2) = 5
5 1 f (3) = 3
4 6 2 f (4) = 6
6 f (5) = 4
f (6) = 2
3
G H f (7) = 1
7 4
Isomorfismo
2 3 5
1
7
f (1) = 7
f (2) = 5
5 1 f (3) = 3
4 6 2 f (4) = 6
6 f (5) = 4
f (6) = 2
3
G H f (7) = 1
7 4
Grafos completos
v
Teorema
Si un grafo tiene 6 o más vértices, entonces el grafo o su
complemento tienen un triángulo.
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
Observaciones
Observaciones
Observaciones
w v z
Conexión
Observaciones
w v z
Observaciones
w v z
2 3
1
4 6
7
Distancia
La longitud de un camino se mide por la cantidad de aristas
que lo componen.
La distancia entre dos vértices v y w en G es la longitud del
camino más corto entre v y w y se nota dG (v , w ). Si el
contexto no es ambiguo, se abrevia d(v , w ).
¿Cuál es la distancia entre 1 y 5?
El disco Dk (v ) de centro v y radio k (k ≥ 0) es el conjunto de
vértices de G que están a distancia menor o igual que k de v .
¿Cuáles son los discos con centro 1 en este grafo?
2 3
1
4 6
7
Distancia
La longitud de un camino se mide por la cantidad de aristas
que lo componen.
La distancia entre dos vértices v y w en G es la longitud del
camino más corto entre v y w y se nota dG (v , w ). Si el
contexto no es ambiguo, se abrevia d(v , w ).
¿Cuál es la distancia entre 1 y 5?
El disco Dk (v ) de centro v y radio k (k ≥ 0) es el conjunto de
vértices de G que están a distancia menor o igual que k de v .
¿Cuáles son los discos con centro 1 en este grafo?
2 3
1
4 6
7
Grafos bipartitos
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Teorema
Un grafo G es bipartito ⇔ todos sus circuitos son pares.
Teorema
Un grafo G es bipartito ⇔ todos sus circuitos son pares.
Demo:
⇒) Sabemos que V (G ) = V1 ∪ V2 y toda arista va de V1 a V2 . Sea
v1 , v2 , . . . , vn un circuito en G . Si v1 ∈ V1 entonces los vértices de
subı́ndice par tienen que pertenecer a V2 y los de subı́ndice impar a V1 .
Como vn es adyacente a v1 , n tiene que ser par.
Teorema
Un grafo G es bipartito ⇔ todos sus circuitos son pares.
Demo:
⇒) Sabemos que V (G ) = V1 ∪ V2 y toda arista va de V1 a V2 . Sea
v1 , v2 , . . . , vn un circuito en G . Si v1 ∈ V1 entonces los vértices de
subı́ndice par tienen que pertenecer a V2 y los de subı́ndice impar a V1 .
Como vn es adyacente a v1 , n tiene que ser par.
⇐) Sea v en V (G ). Definimos V1 y V2 como los vértices que están a
distancia impar o par de v , respectivamente. Supongamos que no es una
bipartición, o sea, existen z y w que están a ambos a distancia par o
impar de v y son adyacentes. Como la diferencia entre las distancias es a
lo sumo 1, entonces están a la misma distancia. Sea v 0 el primer vértice
en común entre los caminos mı́nimos de w a v y de z a v . La longitud de
los sub-caminos de w a v 0 y de z a v 0 tiene que ser la misma. Entonces
esos sub-caminos y la arista wz forman un ciclo impar. 2
Conexión
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
7 2
2 3 1 5
1 6 2 3 4
1 1 1
3
5 2 6
6 6 5
4 5 7 3 7
2 4
8 7
4 8
3 6 5
7 4
Conexión
Observaciones
1. Un grafo es biconexo si y sólo si tiene un solo bloque.
2. Dos bloques de un grafo comparten a lo sumo un vértice. En
particular, cada arista pertenece a un único bloque.
Teorema
Sea G conexo y sea v un vértice de G . Son equivalentes:
mG 0 ≥ mG − 1 > nG − 2 = nG 0 − 1
Lema 1
Si m > n − 1 entonces G tiene un ciclo.
Demo: Por inducción. Si n = 1 o 2, no puede pasar. Si n = 3,
entonces G es un triángulo y tiene un ciclo.
Sea G con nG > 3 y mG > nG − 1. Si todo vértice de G tiene
grado al menos 2, entonces G tiene un ciclo (ej. práctica).
Si no, saco un vértice v con d(v ) ≤ 1. Ahora G 0 = G − v cumple
mG 0 ≥ mG − 1 > nG − 2 = nG 0 − 1
m G = m G 0 + 1 ≥ nG 0 = nG − 1
2
Teorema
Son equivalentes:
1. G es un árbol.
2. Todo par de vértices de G está unido por un único camino.
3. G es conexo y m = n − 1.
4. G es acı́clico y m = n − 1.
G es un árbol ⇔ todo par de vértices de G está unido por un único camino
wi
wi
P
u=w0=z0 wi-1=z i-1 z i
3
1 6 5
1
4 4
2
1 2
Árbol generador mı́nimo
3
1 6 5
1
4 4
2
1 2
peso=16
Árbol generador mı́nimo
3
1 6 5
1
4 4
2
1 2
peso=16
Ejemplo de aplicación
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Kruskal para AGM
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Kruskal para AGM
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Kruskal para AGM
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Kruskal para AGM
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Kruskal para AGM
Ej:
3
1 6 2
1
5 4
7
1 7
Demostración de que Kruskal construye un AGM
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Prim para AGM
Partir de un conjunto de aristas A = {e} y un conjunto de vértices
W = {v , w }, donde e es una arista de peso mı́nimo en G y v y w
son sus extremos. En cada paso, agregar a A una arista f de peso
mı́nimo con un extremo en W y el otro en V (G ) − W . Agregar a
W el extremo de f que no estaba en W , hasta que W = V (G ).
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Prim para AGM
Partir de un conjunto de aristas A = {e} y un conjunto de vértices
W = {v , w }, donde e es una arista de peso mı́nimo en G y v y w
son sus extremos. En cada paso, agregar a A una arista f de peso
mı́nimo con un extremo en W y el otro en V (G ) − W . Agregar a
W el extremo de f que no estaba en W , hasta que W = V (G ).
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Prim para AGM
Partir de un conjunto de aristas A = {e} y un conjunto de vértices
W = {v , w }, donde e es una arista de peso mı́nimo en G y v y w
son sus extremos. En cada paso, agregar a A una arista f de peso
mı́nimo con un extremo en W y el otro en V (G ) − W . Agregar a
W el extremo de f que no estaba en W , hasta que W = V (G ).
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Prim para AGM
Partir de un conjunto de aristas A = {e} y un conjunto de vértices
W = {v , w }, donde e es una arista de peso mı́nimo en G y v y w
son sus extremos. En cada paso, agregar a A una arista f de peso
mı́nimo con un extremo en W y el otro en V (G ) − W . Agregar a
W el extremo de f que no estaba en W , hasta que W = V (G ).
Ej:
3
1 6 2
1
5 4
7
1 7
Algoritmo de Prim para AGM
Partir de un conjunto de aristas A = {e} y un conjunto de vértices
W = {v , w }, donde e es una arista de peso mı́nimo en G y v y w
son sus extremos. En cada paso, agregar a A una arista f de peso
mı́nimo con un extremo en W y el otro en V (G ) − W . Agregar a
W el extremo de f que no estaba en W , hasta que W = V (G ).
Ej:
3
1 6 2
1
5 4
7
1 7
Demostración de que Prim construye un AGM
Para ver que construye un árbol generador, se puede ver que en cada
paso del algoritmo, el subgrafo elegido hasta el momento es conexo y con
m = n − 1. Finalmente, como el grafo es conexo, mientras W 6= V (G ) va
a existir alguna arista de W a V (G ) − W con lo cual el algoritmo
termina construyendo un árbol generador del grafo.
Sea G un grafo, P el árbol generado por el algoritmo de Prim y
{e1 , e2 , . . . , en−1 } la secuencia de aristas de P en el orden en que fueron
elegidas por el algoritmo de Prim. Para cada árbol generador T de G
definimos p(T ) como el máximo k ≤ n tal que ∀j ≤ k, ej ∈ T .
Ahora, sea T un AGM que maximiza p. Si p(T ) = n, entonces T
coincide con P, con lo cual P resulta ser mı́nimo. Si P no es mı́nimo,
entonces p(T ) < n y ep(T ) 6∈ T . Como T es conexo, en T hay un camino
C que une los extremos de ep(T ) .
Demostración de que Prim construye un AGM
Para ver que construye un árbol generador, se puede ver que en cada
paso del algoritmo, el subgrafo elegido hasta el momento es conexo y con
m = n − 1. Finalmente, como el grafo es conexo, mientras W 6= V (G ) va
a existir alguna arista de W a V (G ) − W con lo cual el algoritmo
termina construyendo un árbol generador del grafo.
Sea G un grafo, P el árbol generado por el algoritmo de Prim y
{e1 , e2 , . . . , en−1 } la secuencia de aristas de P en el orden en que fueron
elegidas por el algoritmo de Prim. Para cada árbol generador T de G
definimos p(T ) como el máximo k ≤ n tal que ∀j ≤ k, ej ∈ T .
Ahora, sea T un AGM que maximiza p. Si p(T ) = n, entonces T
coincide con P, con lo cual P resulta ser mı́nimo. Si P no es mı́nimo,
entonces p(T ) < n y ep(T ) 6∈ T . Como T es conexo, en T hay un camino
C que une los extremos de ep(T ) .
Demostración de que Prim construye un AGM
Para ver que construye un árbol generador, se puede ver que en cada
paso del algoritmo, el subgrafo elegido hasta el momento es conexo y con
m = n − 1. Finalmente, como el grafo es conexo, mientras W 6= V (G ) va
a existir alguna arista de W a V (G ) − W con lo cual el algoritmo
termina construyendo un árbol generador del grafo.
Sea G un grafo, P el árbol generado por el algoritmo de Prim y
{e1 , e2 , . . . , en−1 } la secuencia de aristas de P en el orden en que fueron
elegidas por el algoritmo de Prim. Para cada árbol generador T de G
definimos p(T ) como el máximo k ≤ n tal que ∀j ≤ k, ej ∈ T .
Ahora, sea T un AGM que maximiza p. Si p(T ) = n, entonces T
coincide con P, con lo cual P resulta ser mı́nimo. Si P no es mı́nimo,
entonces p(T ) < n y ep(T ) 6∈ T . Como T es conexo, en T hay un camino
C que une los extremos de ep(T ) .
Demostración de que Prim construye un AGM
Cayley
Kempes
La primera referencia publicada se encuentra en el
paper de Arthur Cayley, On the colorings of maps,
Proc. Royal Geographical Society 1, 259–261,
1879.
Kempes
La primera referencia publicada se encuentra en el
paper de Arthur Cayley, On the colorings of maps,
Proc. Royal Geographical Society 1, 259–261,
1879.
X
Si vale (i), entonces cambiamos A a verde, y luego
intercambiamos los colores rojo/verde en la
componente bicromática rojo/verde que contiene a A.
Como C no está en la componente, permanece verde y
ahora no hay más regiones rojas adyacentes a X.
Coloreamos X con rojo.
A B C
D
X
Casos:
X
Si vale (i), entonces cambiamos A a verde, y luego
intercambiamos los colores rojo/verde en la
componente bicromática rojo/verde que contiene a A.
Como C no está en la componente, permanece verde y
ahora no hay más regiones rojas adyacentes a X.
Coloreamos X con rojo.
A B C
Si vale (ii), entonces no puede haber una cadena D
amarilla/azul de regiones adyacentes uniendo B y D.
X
[No podrı́a cruzar la cadena verde/roja.] Entonces la
propiedad (i) vale para B y D y cambiamos los colores
como antes.
El Teorema de los Cuatro Colores volvió a ser Conjetura de los Cuatro
Colores en 1890.
Percy John Heawood, un docente en Durham England,
publicó un paper llamado Map coloring theorem. Ahi
decı́a que su objetivo era “...más destructivo que
constructivo, ya que voy a mostrar un defecto en la
aparentemente reconocida prueba...”.
Aunque Heawood mostró que la prueba de Kempe era
errónea, él probó en ese paper que todo mapa puede
Heawood
ser coloreado usando a lo sumo 5 colores.
Primera prueba
4-coloreo 3-coloreo
Número cromático
Lema
Sea G un grafo de n vértices y G su complemento. Entonces:
1. α(G ) = ω(G )
2. χ(G ) ≥ ω(G )
3. χ(G ) ≤ ∆(G ) + 1
4. χ(G )α(G ) ≥ n
5. χ(G ) + α(G ) ≤ n + 1
6. χ(G ) + χ(G ) ≤ n + 1
Demostraciones:
1. α(G ) = ω(G )
Por definición, ya que los conjuntos independientes maximales de G
son cliques de G . 2
2. χ(G ) ≥ ω(G )
Los vértices de una clique tienen que usar colores distintos, ya que
son adyacentes dos a dos. 2
3. χ(G ) ≤ ∆(G ) + 1
Pintando secuencialmente los vértices con el mı́nimo color no
utilizado por un vecino ya pintado, obtenemos un coloreo válido (no
siempre óptimo) con a lo sumo ∆(G ) + 1 colores. 2
2
1 1 1 1 1
2 2 2 4 2 4
3 3 3
1 1 1 1 1 1
6 2
3 1
3 12
5 4
5 4
6 2
6
3 1 3
3 12 3
5 4 15 4 5 4 4
125
6 2 6 2 6 6
3 1 1 3
36 3
3 12
15 15 4 36 12
5 4 5 4 125 4 125 4
4 5 4
6 36 2 5 4
6 2 2 6 36
2 6
3 1 3 1 36 1
c(G)=3
36 1
5 25 5
4 4 4
25 3 1
4
6 2 6 2
5 4
6 2
Polinomio cromático
Ejemplo 2: Si G es Kn , entonces:
Ejemplo 2: Si G es Kn , entonces:
Ejemplo 2: Si G es Kn , entonces:
Propiedad
PG (k) = PG1 (k) + PG2 (k), donde G1 y G2 son los grafos definidos
en el algoritmo de conexión-contracción.
Polinomio cromático
Propiedad
PG (k) = PG1 (k) + PG2 (k), donde G1 y G2 son los grafos definidos
en el algoritmo de conexión-contracción.
Corolario
PG (k) es un polinomio.
Polinomio cromático
Propiedad
PG (k) = PG1 (k) + PG2 (k), donde G1 y G2 son los grafos definidos
en el algoritmo de conexión-contracción.
Corolario
PG (k) es un polinomio.
4 PG (k)=k(k-1)(k-2)((k-3)(k-4)(k-5) + 4(k-3)(k-4)+4(k-3)+1)
5
6 2
3 1
3 12
5 4
5 4
6 2
6
3 1 3
3 12 3
5 4 15 4 5 4 4
125
6 2 6 2 6 6
3 1 1 3
36 3
3 12
15 15 4 36 12
5 4 5 4 125 4 125 4
4 5 4
6 36 2 5 4
6 2 2 6 36
2 6
k(k-1)(k-2)(k-3)(k-4) k(k-1)(k-2)(k-3) k(k-1)(k-2)(k-3) k(k-1)(k-2)(k-3) k(k-1)(k-2)
3 1 1
k(k-1)(k-2)(k-3)(k-4)
36 1
36
3 1
25 4 5 4 25
5 4
4 6
2
6 2 k(k-1)(k-2)(k-3)(k-4) k(k-1)(k-2)(k-3)
k(k-1)(k-2)(k-3)(k-4)(k-5) k(k-1)(k-2)(k-3)(k-4)
Indice cromático
Claramente, χ0 (G ) ≥ ∆(G ).
Indice cromático
Claramente, χ0 (G ) ≥ ∆(G ).
Indice cromático
Propiedad
Propiedad
Propiedad
Propiedad
∆(G ) ≤ χ0 (G ) ≤ ∆(G ) + 1.
Coloreo por listas
1 2
1 1 2
3 3
k=3 k=3
2 2 2
µ-coloreo
Ahora cada vértice tiene tanto una cota superior como inferior.
< <
PrExt m-coloreo
< <
k-coloreo
¿Se puede dibujar la siguiente figura, empezando y
terminando en el mismo punto, sin levantar e lápiz del
papel?
¿Y esta otra?
Los puentes de Königsberg
Este problema fue resuelto por Euler en 1736, quien demostró que
no era posible. Para eso modeló el problema como un problema de
grafos: recorrer todas las aristas de un grafo una y solo una vez,
volviendo al vértice inicial.
Definiciones
Teorema
Son equivalentes, para G conexo:
1. G es Euleriano.
2. Todo vértice de G tiene grado par.
3. Las aristas de G pueden particionarse en circuitos.
Teorema
Un grafo conexo tiene un camino Euleriano si y sólo si todos sus
vértices tienen grado par salvo dos.
Obs: Los teoremas anteriores valen para multigrafos.
(n − 1)!
2
Recorridos con más de cinco ciudades
¿Cuántos recorridos tengo en un caso con 10 ciudades?
181440
¿Cuántos recorridos tengo en un caso con 50 ciudades?
3041409320171337804361260816606476884437764156896
05120000000000
¿Cuántos recorridos tengo en un caso con 100 ciudades?
4666310772197207634084961942813335024535798413219
0810734296481947608799996614957804470731988078259
1431268489604136118791255926054584320000000000000
000000000
¿Cuántos recorridos tengo en un caso con n ciudades?
(n − 1)!
2
Recorridos con más de cinco ciudades
¿Cuántos recorridos tengo en un caso con 10 ciudades?
181440
¿Cuántos recorridos tengo en un caso con 50 ciudades?
3041409320171337804361260816606476884437764156896
05120000000000
¿Cuántos recorridos tengo en un caso con 100 ciudades?
4666310772197207634084961942813335024535798413219
0810734296481947608799996614957804470731988078259
1431268489604136118791255926054584320000000000000
000000000
¿Cuántos recorridos tengo en un caso con n ciudades?
(n − 1)!
2
Recorridos con más de cinco ciudades
¿Cuántos recorridos tengo en un caso con 10 ciudades?
181440
¿Cuántos recorridos tengo en un caso con 50 ciudades?
3041409320171337804361260816606476884437764156896
05120000000000
¿Cuántos recorridos tengo en un caso con 100 ciudades?
4666310772197207634084961942813335024535798413219
0810734296481947608799996614957804470731988078259
1431268489604136118791255926054584320000000000000
000000000
¿Cuántos recorridos tengo en un caso con n ciudades?
(n − 1)!
2
Recorridos con más de cinco ciudades
¿Cuántos recorridos tengo en un caso con 10 ciudades?
181440
¿Cuántos recorridos tengo en un caso con 50 ciudades?
3041409320171337804361260816606476884437764156896
05120000000000
¿Cuántos recorridos tengo en un caso con 100 ciudades?
4666310772197207634084961942813335024535798413219
0810734296481947608799996614957804470731988078259
1431268489604136118791255926054584320000000000000
000000000
¿Cuántos recorridos tengo en un caso con n ciudades?
(n − 1)!
2
Recorridos con más de cinco ciudades
¿Cuántos recorridos tengo en un caso con 10 ciudades?
181440
¿Cuántos recorridos tengo en un caso con 50 ciudades?
3041409320171337804361260816606476884437764156896
05120000000000
¿Cuántos recorridos tengo en un caso con 100 ciudades?
4666310772197207634084961942813335024535798413219
0810734296481947608799996614957804470731988078259
1431268489604136118791255926054584320000000000000
000000000
¿Cuántos recorridos tengo en un caso con n ciudades?
(n − 1)!
2
Recorridos con más de cinco ciudades
¿Cuántos recorridos tengo en un caso con 10 ciudades?
181440
¿Cuántos recorridos tengo en un caso con 50 ciudades?
3041409320171337804361260816606476884437764156896
05120000000000
¿Cuántos recorridos tengo en un caso con 100 ciudades?
4666310772197207634084961942813335024535798413219
0810734296481947608799996614957804470731988078259
1431268489604136118791255926054584320000000000000
000000000
¿Cuántos recorridos tengo en un caso con n ciudades?
(n − 1)!
2
Recorridos con más de cinco ciudades
¿Cuántos recorridos tengo en un caso con 10 ciudades?
181440
¿Cuántos recorridos tengo en un caso con 50 ciudades?
3041409320171337804361260816606476884437764156896
05120000000000
¿Cuántos recorridos tengo en un caso con 100 ciudades?
4666310772197207634084961942813335024535798413219
0810734296481947608799996614957804470731988078259
1431268489604136118791255926054584320000000000000
000000000
¿Cuántos recorridos tengo en un caso con n ciudades?
(n − 1)!
2
Soluciones óptimas para el TSP
Longitud total de
aproximadamente 66.000
Km (Un poco más de una
vuelta y media a la tierra
por el ecuador).
Solución record (en 2004) de 24978 ciudades de Suecia
Longitud total de
aproximadamente 72.500
Km.
Solución record actual (2005)
Matriz de adyacencia
Matriz de incidencia
Listas de vecinos (para cada vértice, se indica la lista de sus
vecinos).
Cantidad de vértices y lista de aristas (se asumen los vértices
numerados de 1 a n).
Matriz de adyacencia
Ej:
2 0 1 0 0 0 0 0
3
1
1 0 0 1 0 0 1
0 0 0 0 1 1 0
5
0 1 0 0 1 1 1
6
4 0 0 1 1 0 1 0
0 0 1 1 1 0 1
0 1 0 1 0 1 0
7
Propiedades de la matriz de adyacencia
Ej:
1 1 0 0 0 0 0
0 1 0 1 0 0 0
2 3
1 0 1 0 0 0 0 1
0 0 1 0 1 0 0
5 0 0 1 0 0 1 0
6 0 0 0 1 1 0 0
4
0 0 0 1 0 1 0
0 0 0 1 0 0 1
0 0 0 0 1 1 0
7 0 0 0 0 0 1 1
Listas de vecinos
Ej:
L1 :2
1
2 3 L2 :1→4→7
L3 :5→6
5
6
L4 :2→5→6→7
4
L5 :3→4→6
L6 :3→4→5→7
7 L7 :2→4→6
Lista de aristas
Ej:
2 3
1
Cant. vértices: 7
5
6
Aristas: (1,2),(2,4),(2,7),(3,5),
4
(3,6),(4,5),(4,6),(4,7),(5,6),(6,7)
Ejemplo:
Recorrido BFS
BFS: Breadth-First Search, o sea, recorrido a lo ancho. A partir de
un vértice, recorre sus vecinos, luego los vecinos de sus vecinos, y
ası́ sucesivamente.... si al finalizar quedan vértices sin visitar, se
repite a partir de un vértice no visitado.
Ejemplo:
1
Recorrido BFS
BFS: Breadth-First Search, o sea, recorrido a lo ancho. A partir de
un vértice, recorre sus vecinos, luego los vecinos de sus vecinos, y
ası́ sucesivamente.... si al finalizar quedan vértices sin visitar, se
repite a partir de un vértice no visitado.
Ejemplo:
2
Recorrido BFS
BFS: Breadth-First Search, o sea, recorrido a lo ancho. A partir de
un vértice, recorre sus vecinos, luego los vecinos de sus vecinos, y
ası́ sucesivamente.... si al finalizar quedan vértices sin visitar, se
repite a partir de un vértice no visitado.
Ejemplo:
4
5
2
Recorrido BFS
BFS: Breadth-First Search, o sea, recorrido a lo ancho. A partir de
un vértice, recorre sus vecinos, luego los vecinos de sus vecinos, y
ası́ sucesivamente.... si al finalizar quedan vértices sin visitar, se
repite a partir de un vértice no visitado.
Ejemplo:
6
4
5
2
Recorrido BFS
BFS: Breadth-First Search, o sea, recorrido a lo ancho. A partir de
un vértice, recorre sus vecinos, luego los vecinos de sus vecinos, y
ası́ sucesivamente.... si al finalizar quedan vértices sin visitar, se
repite a partir de un vértice no visitado.
Ejemplo:
6 8
4
5
3 7
2
Recorrido BFS
BFS: Breadth-First Search, o sea, recorrido a lo ancho. A partir de
un vértice, recorre sus vecinos, luego los vecinos de sus vecinos, y
ası́ sucesivamente.... si al finalizar quedan vértices sin visitar, se
repite a partir de un vértice no visitado.
Ejemplo:
6 8
4
5
3 7
1 9
2
Recorrido BFS
BFS: Breadth-First Search, o sea, recorrido a lo ancho. A partir de
un vértice, recorre sus vecinos, luego los vecinos de sus vecinos, y
ası́ sucesivamente.... si al finalizar quedan vértices sin visitar, se
repite a partir de un vértice no visitado.
Ejemplo:
6 8
4
5
3 7
1 9
10
2
Recorrido BFS
BFS: Breadth-First Search, o sea, recorrido a lo ancho. A partir de
un vértice, recorre sus vecinos, luego los vecinos de sus vecinos, y
ası́ sucesivamente.... si al finalizar quedan vértices sin visitar, se
repite a partir de un vértice no visitado.
Ejemplo:
6 8
4
5
3 7
1 9
10
2 11
Recorrido BFS: pseudocódigo
w = C.primero(); 1
ord++; 2 4
2 6
orden(w)=ord; 5
C.desencolar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z; 8 11
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1
ord++; 2 4
2 6
orden(w)=ord; 5
C.desencolar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z; 8 11
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1
ord++; 2 4
2 6
orden(w)=ord; 5
C.desencolar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z; 8 11
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1
ord++; 2
2
orden(w)=ord;
C.desencolar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1
ord++; 2
2
orden(w)=ord;
C.desencolar();
Para cada vecino z de w
Si z no está visitado
10
marcar z;
11
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1 9
ord++; 2
2
orden(w)=ord;
C.desencolar();
Para cada vecino z de w
Si z no está visitado
10
marcar z;
11
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1 9
ord++; 2
2
orden(w)=ord;
C.desencolar();
Para cada vecino z de w
Si z no está visitado
marcar z;
11
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1 9
ord++; 2
10
2
orden(w)=ord;
C.desencolar();
Para cada vecino z de w
Si z no está visitado
marcar z;
11
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1 9
ord++; 2
10
2
orden(w)=ord;
C.desencolar();
Para cada vecino z de w
Si z no está visitado
marcar z;
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1 9
ord++; 2
10
2
orden(w)=ord; 11
C.desencolar();
Para cada vecino z de w
Si z no está visitado
marcar z;
C.encolar(z);
Recorrido BFS: pseudocódigo
w = C.primero(); 1 9
ord++; 2
10
2
orden(w)=ord; 11
C.desencolar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
C.encolar(z);
Recorrido BFS: propiedades
Ejemplo:
Recorrido BFS: propiedades
Si partimos desde un vértice v , modificando levemente el código
podemos calcular para cada vértice su distancia a v . Inicialmente
todos los vértices tienen rótulo ∞. Rotulamos el vértice v con 0 y
luego, al visitar los vecinos de cada vértice w que aún tienen rótulo
∞, los rotulamos con el rótulo de w más 1. (Notemos que los que
no sean alcanzados desde v , o sea, no pertenecen a la componente
conexa de v , tienen distancia infinita a v .)
Ejemplo:
Recorrido BFS: propiedades
Si partimos desde un vértice v , modificando levemente el código
podemos calcular para cada vértice su distancia a v . Inicialmente
todos los vértices tienen rótulo ∞. Rotulamos el vértice v con 0 y
luego, al visitar los vecinos de cada vértice w que aún tienen rótulo
∞, los rotulamos con el rótulo de w más 1. (Notemos que los que
no sean alcanzados desde v , o sea, no pertenecen a la componente
conexa de v , tienen distancia infinita a v .)
Ejemplo:
Recorrido BFS: propiedades
Si partimos desde un vértice v , modificando levemente el código
podemos calcular para cada vértice su distancia a v . Inicialmente
todos los vértices tienen rótulo ∞. Rotulamos el vértice v con 0 y
luego, al visitar los vecinos de cada vértice w que aún tienen rótulo
∞, los rotulamos con el rótulo de w más 1. (Notemos que los que
no sean alcanzados desde v , o sea, no pertenecen a la componente
conexa de v , tienen distancia infinita a v .)
Ejemplo:
0
Recorrido BFS: propiedades
Si partimos desde un vértice v , modificando levemente el código
podemos calcular para cada vértice su distancia a v . Inicialmente
todos los vértices tienen rótulo ∞. Rotulamos el vértice v con 0 y
luego, al visitar los vecinos de cada vértice w que aún tienen rótulo
∞, los rotulamos con el rótulo de w más 1. (Notemos que los que
no sean alcanzados desde v , o sea, no pertenecen a la componente
conexa de v , tienen distancia infinita a v .)
Ejemplo:
1
Recorrido BFS: propiedades
Si partimos desde un vértice v , modificando levemente el código
podemos calcular para cada vértice su distancia a v . Inicialmente
todos los vértices tienen rótulo ∞. Rotulamos el vértice v con 0 y
luego, al visitar los vecinos de cada vértice w que aún tienen rótulo
∞, los rotulamos con el rótulo de w más 1. (Notemos que los que
no sean alcanzados desde v , o sea, no pertenecen a la componente
conexa de v , tienen distancia infinita a v .)
Ejemplo:
1
2
1
Recorrido BFS: propiedades
Si partimos desde un vértice v , modificando levemente el código
podemos calcular para cada vértice su distancia a v . Inicialmente
todos los vértices tienen rótulo ∞. Rotulamos el vértice v con 0 y
luego, al visitar los vecinos de cada vértice w que aún tienen rótulo
∞, los rotulamos con el rótulo de w más 1. (Notemos que los que
no sean alcanzados desde v , o sea, no pertenecen a la componente
conexa de v , tienen distancia infinita a v .)
Ejemplo:
2
1
2
1
Recorrido BFS: propiedades
Si partimos desde un vértice v , modificando levemente el código
podemos calcular para cada vértice su distancia a v . Inicialmente
todos los vértices tienen rótulo ∞. Rotulamos el vértice v con 0 y
luego, al visitar los vecinos de cada vértice w que aún tienen rótulo
∞, los rotulamos con el rótulo de w más 1. (Notemos que los que
no sean alcanzados desde v , o sea, no pertenecen a la componente
conexa de v , tienen distancia infinita a v .)
Ejemplo:
2
1 3
2
1 3
1
Recorrido BFS: reconocimiento de grafos bipartitos
Utilizamos una idea parecida a la del algoritmo anterior en cada
componente conexa: rotulamos el vértice v con 0 y luego, al visitar
los vecinos de cada vértice w que aún no tienen rótulo, los
rotulamos con 1 menos el rótulo de w . De esta manera queda
determinada la partición, de ser bipartito el grafo. Queda entonces
verificar que ningún par de vértices con el mismo rótulo sean
adyacentes (ese chequeo se puede ir haciendo en cada paso).
Ejemplo:
Recorrido BFS: reconocimiento de grafos bipartitos
Utilizamos una idea parecida a la del algoritmo anterior en cada
componente conexa: rotulamos el vértice v con 0 y luego, al visitar
los vecinos de cada vértice w que aún no tienen rótulo, los
rotulamos con 1 menos el rótulo de w . De esta manera queda
determinada la partición, de ser bipartito el grafo. Queda entonces
verificar que ningún par de vértices con el mismo rótulo sean
adyacentes (ese chequeo se puede ir haciendo en cada paso).
Ejemplo:
0
Recorrido BFS: reconocimiento de grafos bipartitos
Utilizamos una idea parecida a la del algoritmo anterior en cada
componente conexa: rotulamos el vértice v con 0 y luego, al visitar
los vecinos de cada vértice w que aún no tienen rótulo, los
rotulamos con 1 menos el rótulo de w . De esta manera queda
determinada la partición, de ser bipartito el grafo. Queda entonces
verificar que ningún par de vértices con el mismo rótulo sean
adyacentes (ese chequeo se puede ir haciendo en cada paso).
Ejemplo:
1
Recorrido BFS: reconocimiento de grafos bipartitos
Utilizamos una idea parecida a la del algoritmo anterior en cada
componente conexa: rotulamos el vértice v con 0 y luego, al visitar
los vecinos de cada vértice w que aún no tienen rótulo, los
rotulamos con 1 menos el rótulo de w . De esta manera queda
determinada la partición, de ser bipartito el grafo. Queda entonces
verificar que ningún par de vértices con el mismo rótulo sean
adyacentes (ese chequeo se puede ir haciendo en cada paso).
Ejemplo:
1
0
1
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
1
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
1
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3
2
1
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3 4
2
1
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3 4
2
1
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3 4
2
6 5
1
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3 4
2
7
6 5
1
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3 4
2
7
6 5
8
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3 4
2
7
6 5
1 9
8
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3 4
2
7
6 5
1 9
10
8
Recorrido DFS
DFS: Depth-First Search, o sea, recorrido en profundidad. A partir
de un vértice, comienza por alguno de sus vecinos, luego un vecino
de éste, y ası́ sucesivamente hasta llegar a un vértice que ya no
tiene vecinos sin visitar. Sigue entonces por algún vecino del último
vértice visitado que aún tiene vecinos sin visitar.
Igual que en BFS, si al finalizar quedan vértices sin visitar, se repite
a partir de un vértice no visitado.
Ejemplo:
3 4
2
7
6 5
1 9
10
8 11
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
orden(w)=ord; 7
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
orden(w)=ord; 7
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
orden(w)=ord; 7
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
8
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
8
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1
ord++; 2
8
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1 9
ord++; 2
8
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
10
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1 9
ord++; 2
8
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1 9
ord++; 2
10
8
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
marcar z;
11
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1 9
ord++; 2
10
8
orden(w)=ord;
P.desapilar();
Para cada vecino z de w
Si z no está visitado
marcar z;
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1 9
ord++; 2
10
8
orden(w)=ord; 11
P.desapilar();
Para cada vecino z de w
Si z no está visitado
marcar z;
P.apilar(z);
Recorrido DFS: pseudocódigo
w = P.tope(); 1 9
ord++; 2
10
8
orden(w)=ord; 11
P.desapilar();
Para cada vecino z de w
Si z no está visitado
9 10
marcar z;
11
P.apilar(z);
Propiedades
-1 7
7
a b
v c w
3
1 6 5
1
4 4
2
1 2
Problemas de camino mı́nimo
3
1 6 5
1
4 4
2
1 2
Problemas de camino mı́nimo
Principio de optimalidad
Todo subcamino de un camino mı́nimo es un camino mı́nimo.
Propiedad
Si G no tiene aristas de costo negativo y s es un vértice de G tal que
para todo v ∈ V (G ) existe un camino de s a v , entonces existe un árbol
orientado T con raı́z s tal que para todo v ∈ V (G ), el camino de s a v
en T es un camino mı́nimo de s a v en G .
Arbol de caminos mı́nimos
Propiedad
Si G no tiene aristas de costo negativo y s es un vértice de G tal que
para todo v ∈ V (G ) existe un camino de s a v , entonces existe un árbol
orientado T con raı́z s tal que para todo v ∈ V (G ), el camino de s a v
en T es un camino mı́nimo de s a v en G .
Propiedad
Si G no tiene aristas de costo negativo y s es un vértice de G tal que
para todo v ∈ V (G ) existe un camino de s a v , entonces existe un árbol
orientado T con raı́z s tal que para todo v ∈ V (G ), el camino de s a v
en T es un camino mı́nimo de s a v en G .
Propiedad
Si G no tiene aristas de costo negativo y s es un vértice de G tal que
para todo v ∈ V (G ) existe un camino de s a v , entonces existe un árbol
orientado T con raı́z s tal que para todo v ∈ V (G ), el camino de s a v
en T es un camino mı́nimo de s a v en G .
Propiedad
Si G no tiene aristas de costo negativo y s es un vértice de G tal que
para todo v ∈ V (G ) existe un camino de s a v , entonces existe un árbol
orientado T con raı́z s tal que para todo v ∈ V (G ), el camino de s a v
en T es un camino mı́nimo de s a v en G .
Propiedad
Si G no tiene aristas de costo negativo y s es un vértice de G tal que
para todo v ∈ V (G ) existe un camino de s a v , entonces existe un árbol
orientado T con raı́z s tal que para todo v ∈ V (G ), el camino de s a v
en T es un camino mı́nimo de s a v en G .
La propiedad vale igual para grafos con aristas negativas pero sin
ciclos negativos, aunque la demostración es distinta.
Algoritmo de Dijkstra & Moore
1. π(j) = π ∗ (j) y
2. π(i) = πS∪{j} (i) para i 6∈ S ∪ {j}.
Demostración del lema
1. π(j) = π ∗ (j)
Por HI sabı́amos que π(j) = πS (j). Tomemos un camino P de 1 a j.1
Sea i el primer vértice fuera de S en P (podrı́a ser j), y sea Pi el
subcamino de P que va de 1 a i. Como no hay aristas negativas,
`(P) ≥ `(Pi ) ≥ πS (i) ≥ πS (j) por HI y la forma de elegir j. Luego
π ∗ (j) = πS (j) = π(j).
1
Podemos considerar que existen todas las aristas pero algunas pesan ∞.
Demostración del lema
1. π(j) = π ∗ (j)
Por HI sabı́amos que π(j) = πS (j). Tomemos un camino P de 1 a j.1
Sea i el primer vértice fuera de S en P (podrı́a ser j), y sea Pi el
subcamino de P que va de 1 a i. Como no hay aristas negativas,
`(P) ≥ `(Pi ) ≥ πS (i) ≥ πS (j) por HI y la forma de elegir j. Luego
π ∗ (j) = πS (j) = π(j).
2. π(i) = πS∪{j} (i) para i 6∈ S ∪ {j}
Sea i 6∈ S, i 6= {j}. Claramente, πS∪{j} (i) ≤ mı́n{πS (i), π ∗ (j) + `(ji)}.
Veamos la desigualdad inversa.
1
Podemos considerar que existen todas las aristas pero algunas pesan ∞.
Demostración del lema
1. π(j) = π ∗ (j)
Por HI sabı́amos que π(j) = πS (j). Tomemos un camino P de 1 a j.1
Sea i el primer vértice fuera de S en P (podrı́a ser j), y sea Pi el
subcamino de P que va de 1 a i. Como no hay aristas negativas,
`(P) ≥ `(Pi ) ≥ πS (i) ≥ πS (j) por HI y la forma de elegir j. Luego
π ∗ (j) = πS (j) = π(j).
2. π(i) = πS∪{j} (i) para i 6∈ S ∪ {j}
Sea i 6∈ S, i 6= {j}. Claramente, πS∪{j} (i) ≤ mı́n{πS (i), π ∗ (j) + `(ji)}.
Veamos la desigualdad inversa. Sea P un camino de 1 a i que sólo pasa
por S ∪ {j}. Sea v el último vértice antes de i en P. Si v = j, entonces
`(P) ≥ π ∗ (j) + `(ji) (∗).
1
Podemos considerar que existen todas las aristas pero algunas pesan ∞.
Demostración del lema
1. π(j) = π ∗ (j)
Por HI sabı́amos que π(j) = πS (j). Tomemos un camino P de 1 a j.1
Sea i el primer vértice fuera de S en P (podrı́a ser j), y sea Pi el
subcamino de P que va de 1 a i. Como no hay aristas negativas,
`(P) ≥ `(Pi ) ≥ πS (i) ≥ πS (j) por HI y la forma de elegir j. Luego
π ∗ (j) = πS (j) = π(j).
2. π(i) = πS∪{j} (i) para i 6∈ S ∪ {j}
Sea i 6∈ S, i 6= {j}. Claramente, πS∪{j} (i) ≤ mı́n{πS (i), π ∗ (j) + `(ji)}.
Veamos la desigualdad inversa. Sea P un camino de 1 a i que sólo pasa
por S ∪ {j}. Sea v el último vértice antes de i en P. Si v = j, entonces
`(P) ≥ π ∗ (j) + `(ji) (∗). Si v ∈ S, sea P 0 el camino que se obtiene de
reemplazar en P el subcamino de 1 a v por un camino de 1 a v de
longitud π ∗ (v ) que sólo pase por S, que por HI sabemos que existe.
Entonces `(P) ≥ `(P 0 ) ≥ πS (i) (∗∗).
Por (∗) y (∗∗), vale πS∪{j} (i) ≥ mı́n{πS (i), π ∗ (j) + `(ji)}. 2
1
Podemos considerar que existen todas las aristas pero algunas pesan ∞.
Algoritmo de Bellman & Ford
Algoritmo de Dantzig
Algoritmo de Floyd
La teorı́a de NP-completitud
k=2
1 2
1 2 1 2
1 2 3 3
k=3
2 2
1 2
k=2
12 2
Modelos de Computadoras: DTM
Control
Cabeza lecto-escritora
Cinta . . . . . .
Σ = {a, b}; q q
Γ = Σ ∪ {∗};
Q = {q0 , q1 , qsi , qno };
Qf = {qsi , qno } Control
q
S = (q0 , a, q0 , a, +1),
. . . * * * a b a a b b * * * * * . . .
(q0 , b, q1 , a, −1),
(q0 , ∗, qsi , ∗, −1),
(q1 , a, q0 , a, −1),
(q1 , b, qno , a, −1),
(q1 , ∗, q0 , b, +1)
Modelos de Computadoras: DTM
Σ = {a, b};
q
Γ = Σ ∪ {∗};
Q = {q0 , q1 , qsi , qno };
Qf = {qsi , qno } Control
q
S = (q0 , a, q0 , a, +1),
. . . * * * a b a a a b * * * * * . . .
(q0 , b, q1 , a, −1),
(q0 , ∗, qsi , ∗, −1),
(q1 , a, q0 , a, −1),
(q1 , b, qno , a, −1),
(q1 , ∗, q0 , b, +1)
Modelos de Computadoras: DTM
Σ = {a, b};
q
Γ = Σ ∪ {∗};
Q = {q0 , q1 , qsi , qno };
Qf = {qsi , qno } Control
q
S = (q0 , a, q0 , a, +1),
. . . * * * a b a a a b * * * * * . . .
(q0 , b, q1 , a, −1),
(q0 , ∗, qsi , ∗, −1),
(q1 , a, q0 , a, −1),
(q1 , b, qno , a, −1),
(q1 , ∗, q0 , b, +1)
Modelos de Computadoras: DTM
Σ = {a, b};
Γ = Σ ∪ {∗}; q q
Σ = {a, b};
Γ = Σ ∪ {∗}; q q
Σ = {a, b};
Γ = Σ ∪ {∗}; q q
Σ = {a, b};
Γ = Σ ∪ {∗}; q q
Σ = {a, b};
Γ = Σ ∪ {∗}; q q
Σ = {a, b};
Γ = Σ ∪ {∗}; q q
Σ = {a, b};
Γ = Σ ∪ {∗}; q q
Σ = {a, b};
Γ = Σ ∪ {∗}; q q
Σ = {a, b};
Γ = Σ ∪ {∗}; q
q
Σ = {a, b};
Γ = Σ ∪ {∗}; q
q
Σ = {a, b};
Γ = Σ ∪ {∗}; q
q
Σ = {a, b};
Γ = Σ ∪ {∗}; q
q
Σ = {a, b};
Γ = Σ ∪ {∗}; q
q
Σ = {a, b};
Γ = Σ ∪ {∗}; q
q
Σ = {a, b};
Γ = Σ ∪ {∗}; q
q
q0
q si q no q no q no q no
q si
Modelos de Computadoras: NDTM
G tiene:
ϕ = (x1 ∨¬x2 ∨x3 )∧(x2 ∨¬x3 )
V1 : un vértice por cada variable negada y
afirmada, todos adyacentes entre si.
completo
G
V2 : un vértice por cada cláusula, x1
adyacente a los literales de V1 que no
x1 C1
aparecen en la cláusula. x1
x2
V3 : otro vértice por cada variable, x2
x2
adyacente a todo V2 y a los literales de V1 C2 x3
x3
correspondientes a otras variables.
x3
k = dos veces la cantidad de variables.
k=6
Queda como ejercicio escribir formalmente la reducción y demostrar que
es una reducción polinomial de SAT a coloreo.
Reducción de SAT a coloreo
completo
G
x1
x1 C1 x1
x2
x2
x2
x3 C2 x3
x3
k=6
Reducción de SAT a 3-SAT