Este documento presenta varios algoritmos para encontrar caminos óptimos en grafos. Explica el algoritmo de búsqueda en anchura (breadth-first search) para encontrar el camino más corto sin considerar pesos. Luego describe el algoritmo de Dijkstra para encontrar el camino mínimo en grafos con pesos positivos y el algoritmo de Bellman-Ford para grafos con pesos positivos y negativos. Finalmente, proporciona ejemplos y pseudocódigo para cada algoritmo.
2. 2
Tabla de contenidos
1. Algoritmos de búsqueda del camino mínimo
1. Algoritmo Breadth first search
2. Algoritmo de Dijkstra
3. Algoritmo de Bellman-Ford
4. Algoritmo de Floyd-Warshall
2. Algoritmos de búsqueda del árbol de
recubrimiento mínimo
1. Algoritmo de Prim
3. Trabajo en equipo
4. Bibliografía
4. 4
Algoritmo Breadth-first search
• Objetivo:
Encontrar el camino mínimo desde un nodo inicial a todos los demás
nodos de un grafo sin tener en cuenta los pesos de los nodos
• Ejemplo de uso:
Saber el número de escalas que hay
que hacer desde un aeropuerto para
llegar a otro
5. 5
Algoritmo Breadth-first search
Pseudocódigo
método breadth_first_search(grafo, origen)
inicializar
crear cola Q
agregar origen a cola Q
mientras Q no esté vacia:
sacar elemento v de la cola Q
marcar como visitado v
para cada nodo adyacente w a v en el grafo:
si w no ha sido visitado y no está en la cola:
actualizar el contador de w (ahora es v+1)
actualizar el predecesor de w (ahora es v)
insertar w dentro de la cola Q:
12. 12
Algoritmo Breadth-first search
Paso 6
Proceso
V0,2
V2,1 VO V1
V0,2 V1,3
0 V2 V3 V4
V3,3
V2,1 V5 V6
COLA DE PROCESO
V6 V4 V3 V1 V5 V0 V2
13. 13
Algoritmo Breadth-first search
Paso 7
Proceso
V0,2
V2,1 VO V1
V0,2 V1,3
0 V2 V3 V4
V3,3
V2,1 V5 V6
COLA DE PROCESO
V6 V4 V3 V1 V5 V0 V2
14. 14
Algoritmo Breadth-first search
Paso 8
Proceso
V0,2
V2,1 VO V1
V0,2 V1,3
0 V2 V3 V4
V3,3
V2,1 V5 V6
COLA DE PROCESO
V6 V4 V3 V1 V5 V0 V2
15. 15
Algoritmo Breadth-first search
A
Ejercicio 1
B
• Dada la siguiente
organización de
objetos, especificar el D
H C
orden en el que se
han recorrido los K
E
objetos antes de
J F
llegar a encontrar el
objeto M desde A L
G
M
I
16. 16
Algoritmo de Dijkstra
• Objetivo:
Encontrar el camino mínimo desde un nodo inicial a todos los demás
nodos de un grafo con pesos positivos
• Ejemplo de uso:
Averiguar la ruta más corta entre dos
poblaciones a través de una red de
carreteras
17. 17
Algoritmo de Dijkstra
Pseudocódigo
método dijkstra(grafo, origen)
inicializar
crear cola de prioridades Q ordenada de menor a mayor peso
agregar origen a cola Q
mientras Q no esté vacia:
sacar elemento v de la cola Q
marcar como visitado v
para cada nodo adyacente w a v en el grafo:
si (peso de w) > (peso de v + peso entre v y w):
actualizar el peso de w (disminuye)
actualizar el predecesor de w (ahora es v)
si w no ha sido visitado:
si w está en la cola Q:
actualizar prioridad de w
y si w no está en la cola:
insertar w dentro de la cola Q:
18. 18
Algoritmo de Dijkstra
Paso 1
Proceso Nodo inicial
0 2
VO V1
4 1 3 10
2 2
V2 V3 V4
5 4 6
8
1
V5 V6
COLA DE PROCESO
V0,0
19. 19
Algoritmo de Dijkstra
Paso 2
Proceso
V0,2
0 2
VO V1
4 1 3 10
V0,1
2 2
V2 V3 V4
5 4 6
8
1
V5 V6
COLA DE PROCESO
V3,1 V1,2 V0,0
20. 20
Algoritmo de Dijkstra
Paso 3
Proceso
V0,2
0 2
VO V1
4 1 3 10
V3,3 V0,1
2 2 V3,3
V2 V3 V4
5 4 6
8
1 V3,5
V3,9 V5 V6
COLA DE PROCESO
V4,3 V6,5 V5,9 V2,3 V3,1 V1,2 V0,0
21. 21
Algoritmo de Dijkstra
Paso 4
Proceso
V0,2
0 2
VO V1
4 1 3 10
V3,3 V0,1
2 2 V3,3
V2 V3 V4
5 4 6
8
1 V3,5
V3,9 V5 V6
COLA DE PROCESO
V4,3 V6,5 V5,9 V2,3 V3,1 V1,2 V0,0
22. 22
Algoritmo de Dijkstra
Paso 5
Proceso
V0,2
0 2
VO V1
4 1 3 10
V3,3 V0,1
2 2 V3,3
V2 V3 V4
5 4 6
8
1 V3,5
V3,9 V5 V6
COLA DE PROCESO
V4,3 V6,5 V5,9 V2,3 V3,1 V1,2 V0,0
23. 23
Algoritmo de Dijkstra
Paso 6
Proceso
V0,2
0 2
VO V1
4 1 3 10
V3,3 V0,1
2 2 V3,3
V2 V3 V4
5 4 6
8
1 V3,5
V2,8
V3,9 V5 V6
COLA DE PROCESO
V4,3 V6,5 V5,8
V5,9 V2,3 V3,1 V1,2 V0,0
24. 24
Algoritmo de Dijkstra
Paso 7
Proceso
V0,2
2
0 2
VO V1
4 1 3 10
V3,3 V0,1
2 2 V3,3
V2 V3 V4
5 4 6
8
1 V3,5
V6,6
V2,8 V5 V6
COLA DE PROCESO
V4,3 V6,5 V5,6
V5,8 V2,3 V3,1 V1,2 V0,0
25. 25
Algoritmo de Dijkstra
Paso 8
Proceso
V0,2
0 2
VO V1
4 1 3 10
V3,3 V0,1
2 2 V3,3
V2 V3 V4
5 4 6
8
1 V3,5
V6,6 8 V5 V6
COLA DE PROCESO
V4,3 V6,5 V5,6 V2,3 V3,1 V1,2 V0,0
26. 26
Algoritmo de Dijkstra
Ejercicio 1
• Desde la población S hay 18 kilómetros a la población A y 15 Km a
la población C
• Desde la población A hay 9 Km a la población B y 6 Km a la
población C
• Desde la población C hay 7 Km a la población D
• Desde la población B hay 28 Km a la población T y 10 Km a la
población D
• Desde la población D hay 36 Km la población T
• Calcula las rutas mínimas desde la población S al resto de
poblaciones teniendo en cuenta que todas las carreteras tienen
sentido de ida y vuelta
27. 27
Algoritmo de Dijkstra
Ejercicio 2
• Dado el siguiente sistema, encontrar el camino mínimo desde A a
todos los demás nodos
6
B G
2
2 4 3
A
6 5
1 H
C E
4 2 1
3 10
1
D F
28. 28
Algoritmo de Bellman-Ford
• Objetivo:
Encontrar el camino mínimo desde un nodo inicial a todos los demás
nodos de un grafo con pesos positivos y negativos
• Ejemplo de uso:
Protocolos de encaminamiento de
información
29. 29
Algoritmo de Bellman-Ford
Pseudocódigo
método bellman_ford(grafo, origen)
inicializar
crear cola Q
agregar origen a cola Q
mientras Q no esté vacia:
sacar elemento v de la cola Q
si hay bucle negativo
“bucle negativo”
y si no, para cada nodo adyacente w a v en el grafo:
si (peso de w) > (peso de v + peso entre v y w):
actualizar el peso de w (disminuye)
actualizar el predecesor de w (ahora es v)
si w no está en la cola:
insertar w dentro de la cola Q:
31. 31
Algoritmo de Bellman-Ford
Paso 2
Proceso V0,-1
V1
-1
Nodo inicial 2
3
0 2
VO
V4
4
-3
1
V2 V3
V0,4
COLA DE PROCESO
V2 V1 V0
32. 32
Algoritmo de Bellman-Ford
Paso 3
Proceso V0,-1
V1
-1
Nodo inicial 2
3 V1,1
0 2
VO
V4
4
-3
1
V2 V3
V1,2
V0,4
V1,1
COLA DE PROCESO
V4 V3 V2 V1 V0
33. 33
Algoritmo de Bellman-Ford
Paso 4
Proceso V0,-1
V1
-1
Nodo inicial 2
3 V1,1
0 2
VO
V4
4
-3
1
V2 V3
V1,2
V1,1
COLA DE PROCESO
V4 V3 V2 V1 V0
34. 34
Algoritmo de Bellman-Ford
Paso 5
Proceso V0,-1
V1
-1
Nodo inicial 2
3 V1,1
0 2
VO
V4
4
-3
1
V2 V3
V1,2
V1,1
COLA DE PROCESO
V4 V3 V2 V1 V0
35. 35
Algoritmo de Bellman-Ford
Paso 6
Proceso V0,-1
V1
-1
Nodo inicial 2
3 V1,1
0 2
VO
V4
4
-3
1
V2 V3
V1,2
V4,-2
V1,1
COLA DE PROCESO
V3 V4 V3 V2 V1 V0
36. 36
Algoritmo de Bellman-Ford
Paso 7
Proceso V0,-1
V1
-1
Nodo inicial 2
3 V1,1
0 2
VO
V4
4
-3
1
V2 V3
V3,-1
V1,2
V4,-2
V1,1
COLA DE PROCESO
V2 V3 V4 V3 V2 V1 V0
37. 37
Algoritmo de Bellman-Ford
Paso 8
Proceso V0,-1
V1
-1
Nodo inicial 2
3 V1,1
0 2
VO
V4
4
-3
1
V2 V3
V3,-1
V1,2
V4,-2
V1,1
COLA DE PROCESO
V2 V3 V4 V3 V2 V1 V0
38. 38
Algoritmo de Bellman-Ford
Ejercicio 1
• Dado el siguiente sistema basado en las penalizaciones que tiene
un jugador en función de las acciones que realiza en un
videojuego, encontrar las secuencias de acciones cuya
penalización sea mínima desde el inicio del juego (nodo A)
5
6 B -2 E
A
-3
2 8
7
7
-4
9
C D
39. 39
Algoritmo de Bellman-Ford
Ejercicio 2
• En base a la tabla, calcular el camino mínimo desde V2 al resto de
nodos:
V0 V1 V2 V3 V4 V5 V6
V0 0 4 2
V1 0 2
V2 2 0 3
V3 6 0 6 5 8
V4 -10 0 6
V5 0
V6 1 0
40. 40
Algoritmo de Floyd-Warshall
• Objetivo:
Encontrar el camino mínimo entre todos los pares de nodos de un
grafo
• Ejemplo de uso:
Averiguar la ruta más corta entre
TODAS las poblaciones a través de
una red de carreteras
41. 41
Algoritmo de Floyd-Warshall
Pseudocódigo
método floyd-warshall(grafo)
M[i, j] := ∞ ∀i != j
M[i, j] := p(i, j) ∀(i, j) ∈ en el grafo
M[i, i] := 0 ∀i
for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
si M[i, j] > M[i, k] + M[k, j]
M[i, j] = M[i, k] + M[k, j]
for i := 1 to n do
si M[i, i] < 0
“bucle negativo”
42. 42
Algoritmo de Floyd-Warshall
Paso 1
Proceso
Matriz de adyacencia W
V1 V2 V3 V4 V5
V2
3 4 V1 0 3 8 INF -4
V2 INF 0 INF 1 7
8
V1 V3 V3 INF 4 0 INF INF
7 1
V4 2 INF -5 0 INF
-4 -5
2 V5 INF INF INF 6 0
6
V5 V4
0 si i=j
W ij = ∞ si los vértices i,j no son adyacentes
El peso de la arista si los vértices i,j si son adyacentes
43. 43
Algoritmo de Floyd-Warshall
Proceso Paso 2
K=0
D(k)ij Wij si k=0 NIL si i=j o si Dij = INF
Pij
min(D(k-1)ij, D(k-1)ik+ D(k-1)kj) si k > 0 i el resto
Matriz de adyacencia D(0) Matriz de predecesores P(0)
V1 V2 V3 V4 V5 V1 V2 V3 V4 V5
V1 0 3 8 INF -4 V1 NIL 1 1 NIL 1
V2 INF 0 INF 1 7 V2 NIL NIL NIL 2 2
V3 INF 4 0 INF INF V3 NIL 3 NIL NIL NIL
V4 2 INF -5 0 INF V4 4 NIL 4 NIL NIL
V5 INF INF INF 6 0 V5 NIL NIL NIL 5 NIL
51. 51
Algoritmo de Floyd-Warshall
Ejercicio 1
• Calcular la distancia mínima entre todos
los pares de nodos
3
V1 V2
4
6 3 1 V5
2
1
V3 V4
2
52. 52
Algoritmo de Floyd-Warshall
Ejercicio 2
• Busca un ejemplo en el que al aplicar Floyd-Warshall aparezca
un bucle infinito y aplica el algoritmo para visualizar la matriz de
adyacencia y la matriz de predecesores
1
V1 V2
-3
1
1
1
V4 V3
54. 54
Algoritmo de Prim
• Objetivo:
Encontrar el árbol de recubrimiento mínimo en un grafo conexo, no
dirigido
• Ejemplo de uso: Un grafo es conexo si cada par de
vértices está conectado por un camino
Trazar la mínima cantidad de cable
posible para cubrir las necesidades
de una nueva urbanización
55. 55
Algoritmo de Prim
Pseudocódigo
método prim(grafo, origen)
1- marcar un nodo dentro del grafo, el cual será el nodo de partida
2- seleccionar la arista de menor valor que salga del nodo marcado
3- marcar el nodo al que llega la arista seleccionada en el paso
previo
4- repetir los pasos 2 y 3 de tal modo que se vayan obteniendo
aristas entre nodos marcados y otros que no lo están
5- el algoritmo termina cuando están todos los nodos marcados
56. 56
Algoritmo de Prim
Paso 1
Proceso
7
VO 8
V1 V2
9 7
5 5
15
V3 V4
6 8
Nodo inicial 9
V5
11
V6
61. 61
Algoritmo de Prim
Paso 6
Proceso
7
VO 8
V1 V2
9 7 Árbol Opciones Grafo
5 5
{V0, V1, V3, {V3, V1} = C {V2, V6}
V4, V5} {V3, V4} = C
{V5, V4} = C
15 {V5, V6} = 11
V3 V4 {V1, V2} = 8
{V4, V2} = 5
6 8 {V4, V6} = 9
V5 9
11
V6
62. 62
Algoritmo de Prim
Paso 7
Proceso
7
VO 8
V1 V2
9 7 Árbol Opciones Grafo
5 5
{V0, V1, V2, {V3, V1} = C {V6}
V3, V4, V5} {V3, V4} = C
{V5, V4} = C
15 {V5, V6} = 11
V3 V4 {V1, V2} = C
{V4, V6} = 9
6 8
V5 9
11
V6
63. 63
Algoritmo de Prim
Paso 8
Proceso
7
VO 8
V1 V2
9 7 Árbol Opciones Grafo
5 5
{V0, V1, V2, {V3, V1} = C {}
V3, V4, V5, {V3, V4} = C
V6} {V5, V4} = C
15 {V5, V6} = C
V3 V4 {V1, V2} = C
6 8
V5 9
11
V6
64. 64
Trabajo en equipo
• Realizar trabajos en grupo para presentarlos y
defenderlos en clase
• El trabajo de grafos puede consistir en:
▫ Escoger un algoritmo y aplicarlo en un caso real
▫ Comparar dos o más algoritmos
• Se entregará en formato Power Point en el campus
virtual
65. 65
Bibliografía
• WEISS, Mark Allen; (2000) Data Estructures & Problem Solving Using Java.
Addison Wesley. ISBN 03-2154-140-5.
• JAIME SISA, Alberto; (2002) Estructuras de Datos y Algoritmos con énfasis en
programación orientada a objetos. Pearson Educación. ISBN 958-699-044-3.
• JOYANES AGUILAR, LUIS (2007) Estructuras de Datos en Java. McGraw Hill. ISBN:
9788448156312.
• STANDISH, Thomas A (1998). Data structures in Java. Addison Wesley ISBN 0-201-
30564-X.
• WEISS, Mark Allen; (2000) Estructuras de Datos en Java. Addison Wesley. ISBN 84-
7829-035-4.
• WIRTH, Niklaus (1992). Algoritmos + Estructuras de Datos = Programas. Prentice-
Hall. ISBN: 84-219-0172-9.