2. Contenido:
1. Introducción.
2. Concepto de Grafo.
3. Ordenación topológica.
4. Implementación Java.
5. Matriz de Caminos: Algoritmo de
Warshall.
6. Implementación Java.
7. Caminos más cortos con un solo
origen: Algoritmo de Dijkstra.
8. Implementación Java.
9. Conclusiones
10. Referencias y enlace de códigos.
2
3. Introducción.
Existen numerosos problemas que se pueden modelar en términos de
grafos.
Por ejemplo: la planificación de las tareas que completan un proyecto,
encontrar las rutas de menor longitud entre dos puntos geográficos,
calcular el camino más rápido en un transporte, etc.
Se estudian en este capítulo el concepto de ordenación topológica, los
problemas del camino más corto, estos algoritmos han sido desarrollado
por grandes investigadores y en su honor se conocen por sus nombre es:
Dijkstra, Warshall, Prim, Kruscal, Ford-Fulkerson entre otros. 3
4. Grafos:
Los grafos son un conjunto de nodos y aristas conectadas entre sí. En
el ámbito de las ciencias de la computación es un tipo abstracto de
datos (TAD), que consiste en un conjunto de nodos (también llamados
vértices) y un conjunto de arcos (aristas) que establecen relaciones
entre los nodos.
Ejemplo:
4
5. Ordenación Topológica.
Es un sistema de ordenamiento de un grafo acíclico (no tiene ciclos).
Consiste en organizar de forma lineal/lista (ascendente/descendente),
una serie de vértices en desorden, primero se debe de empezar de un
"vértice padre" (sin predecesores), y después visitar a sus vecinos,
después de que haya visitado a todos sus vecinos, pasa a analizar otro
vértice, identifica sus vecinos, y así recursivamente, hasta que haya
visitado a todos los vértices.
“En pocas palabras no se visitará un vértice, hasta que todos sus
predecesores hayan sido visitados”.
5
6. Ejemplo: estructura de prerrequisito de 8 cursos.
T12
E11
C22
M21
R23 S32
S31 T41
Un arista cualquiera (r,s)
significa que el curso “r” debe
completarse antes de empezar
el curso s.
6
24. Ordenación Topológica.
Una ordenación topológica de estos cursos es cualquier secuencia
de cursos que cumple los requerimientos (prerrequisito). Entonces,
para un grafo dirigido acíclico no tiene por qué existir una única
ordenación topológica.
Ordenaciones topológicas:
E11 - T12 - M21 - C22 - R23 - S31 - S32 - T41
T12 - E11 - R23 - C22 - M21 - S31 - S32 - T41
24
25. Algoritmo de Ordenación Topológica.
★ Busca un vértice “V” que no contenga predecesores (Sin arcos de
entrada).
★ Este vértice “V” pasa a formar parte de la ordenación “T” (Cola).
★ Ya que el vértices sin predecesores, se añadió a “T”, este es eliminado del
grafo inicial (Todos los arcos que salen de “V” son eliminados). Y se
disminuye el grado de los vértices adyacentes.
★ Se repite el proceso.
★ Se toma otro vértices “W”, que no contenga arcos de entrada.
★ Se incorpora a la ordenación “T”. 25
26. Implementación. Algoritmo de Ordenación Topológica.
Representación de un grafo dirigido con una lista de adyacencia y una pila para la
ordenación de los elementos.
26
31. Complejidad de la ordenación topológica.
La complejidad de este algoritmo depende de la
representación del grafo.
★ Representación del grafo con listas de adyacencia,
es O(a+n), siendo “a” el número de arcos y “n” el
número de vértices.
★ Representación de un grafo con una matriz de
adyacencia, la complejidad es O(n2).
31
32. Matriz de Caminos: Algoritmo de Warshall.
★ Calcula la matriz de caminos P (también llamado cierre transitivo)
de un grafo G de n vértices, representado por su matriz de
adyacencia A.
★ Con frecuencia, se suele confundir este algoritmo con el de Floyd
Warshall (encuentra el camino mínimo de grafos dirigidos
ponderados).
★ El algoritmo de Warshall, trabaja sobre grafos dirigidos no
ponderados, y encuentra caminos entre un par de vértices.
32
33. Estrategia del algoritmo de Warshall.
★ Recibe una matriz de adyacencia de un grafo de “n” vértices y retorna una matriz
de caminos llamada “Cierre transitivo”.
★ El algoritmo consiste en definir a nivel lógico, una secuencia de matrices n-
cuadradas P0, P1, P2, P3 ... Pn; los elementos de cada una de las matrices Pk[i,j]
tienen el valor 0 si no hay camino y 1 si existe un camino del vértice i y al j.
★ A cada nodo del grafo, lo convierte en un “puente” para comunicar las aristas.
★ El nodo “puente” ayudará a encontrar caminos entre los vértices, e irá aumentando
los posibles caminos según se acaben los nodos.
★ La matriz P0 es la matriz de adyacencia y la matriz Pn es la matriz de caminos.
33
34. Ejemplo: matriz de caminos de un grafo.
a
d
c
b
Como el grafo no es ponderado,
colocamos un “1”, si hay un camino desde
un vértice a otro o un “0”, si no existe un
posible camino.
a b c d
a 0 1 0 0
b 0 0 0 1
c 0 0 0 0
d 1 0 1 0
34
35. Encontrando matriz de caminos. “M1”
a
d
c
b
a b c d
a 0 1 0 0
b 0 0 0 1
c 0 0 0 0
d 1 1 1 0
35
36. Encontrando matriz de caminos. “M2”
a
d
c
b
a b c d
a 0 1 0 1
b 0 0 0 1
c 0 0 0 0
d 1 1 1 1
Del proceso anterior.
36
37. Encontrando matriz de caminos. “M3”
a
d
c
b
a b c d
a 0 1 0 1
b 0 0 0 1
c 0 0 0 0
d 1 1 1 1
Del proceso anterior.
“c” no tiene conexión con ningún otro nodo,
Aún si lo eliminamos. Entonces M2 = M3.
Del
proceso
anterior.
37
38. Encontrando matriz de caminos. “M4”
a
d
c
b
a b c d
a 1 1 1 1
b 1 1 1 1
c 0 0 0 0
d 1 1 1 1
Del proceso anterior.
Del
proceso
anterior.
38
39. Matriz de caminos (matriz booleana).
a
d
c
b
a b c d
a 1 1 1 1
b 1 1 1 1
c 0 0 0 0
d 1 1 1 1
39
41. 41
Función de Warshall. Establece relaciones entre vértices.
a b c d
a 0 1 0 0
b 0 0 0 1
c 0 0 0 0
d 1 0 1 0
41
Matriz de Adyacencia.
42. Complejidad del Algoritmo de Warshall.
★ La complejidad de este algoritmo es cúbica O(n3),
siendo n el número de vértices.
★ Lo que hace que el tiempo de ejecución crezca
rápidamente para grafos con, relativamente muchos
nodos.
42
43. Caminos más cortos con un solo origen:
Algoritmo de Dijkstra.
Uno de los problemas que se encuentran en la programación
y en la vida real, es encontrar el camino más corto entre dos
puntos (vértices). El algoritmo que se presenta a
continuación, tiene como requisito que el grafo a ser tratado
sea dirigido y que sus aristas sean valoradas (grafo
ponderado). De esta manera podremos encontrar la ruta
mínima para llegar de un vértice a otro.
43
44. Observación:
Este algoritmo encuentra el camino más corto desde un vértice al
resto de vértices de un grafo, es un algoritmo ávido (voraz). Además
debe cumplir que sus aristas no contengan pesos negativos.
Aplicación:
En el campo de la telemática, podemos resolver grafos con muchos
nodos, los cuales serían muy complicados de hacer sin dicho
algoritmo, encontrando así las rutas más cortas entre un origen y
todos los destinos en una red.
44
46. Camino más corto entre dos vértices (Etiquetado).
[ 8 , B](2)
Distancia acumulada
(Desde el inicio hasta
este nodo).
Desde que nodo procede.
Número de
iteraciones
realizadas.
46
47. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
47
48. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0 , -](0)
48
49. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1)
49
50. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1)
50
51. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1)
[ 4,C](2)
[ 5,C](2)
51
52. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1)
[ 4,C](2)
[ 5,C](2)
52
53. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1)
[ 4,C](2)
[ 5,C](2)
[ 3,B](3)
53
54. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1) [ 5,C](2)
[ 3,B](3)
54
55. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1) [ 5,C](2)
[ 3,B](3)
55
56. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1) [ 5,C](2)
[ 3,B](3)
[ 5,D](4)
56
57. Camino más corto entre dos vértices.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1) [ 5,C](2)
[ 3,B](3)
[ 5,D](4)
57
58. Camino más corto entre A y F.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1) [ 5,C](2)
[ 3,B](3)
[ 5,D](4)
Empezamos por el nodo “F”:
F
D
B
A
58
59. Camino más corto entre A y F.
A
D
B
C E
F
2
4
1
3
1
2
2
[ 0,-](0)
[ 2,A](1)
[ 1,A](1) [ 5,C](2)
[ 3,B](3)
[ 5,D](4)
Finalmente la ruta obtenida es:
A - B - D - F
La distancia obtenida es: 5
59
64. Función que imprime los caminos a todos los vértices.
64
A
D
B
C E
F
2
4
1
3
1
2
2
Ejemplo de aplicación
desde el vértice A a
todos los vértices
(Caminos y Costos).
66. Conclusiones.
★ En el ordenamiento topológico se tiene relaciones de precedencia que se representan
con un grafo dirigido/acíclico, donde los vértices son tareas/prerrequisitos y la arista
representa que el inicio de la futura tarea depende de la finalización de la anterior.
★ El orden de un grafo con el método topológico implica obtener una planificación u
orden de prerrequisitos.
★ El algoritmo de Warshall devuelve una matriz de caminos, que indica todos los posibles
caminos de un vértice a otro (pasando por otros vértices), siendo un grafo dirigido.
★ El algoritmo de dijkstra es eficiente a la hora de encontrar un camino partiendo de un
nodo específico hacia cualquier nodo del grafo.
66
67. Bibliografía.
★ Luis Joyanes Aguilar, I. Z. (2008). Estructura de datos en Java.
España: MCGRAW - HILL/INTERAMERICANA DE ESPAÑA, S.A.U.
67
Link de los códigos implementados en Java.
★ https://github.com/UcuencaProgramacionIII/EjerciciosProgramacionC
apitulos16