Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema I: Grafos.
Título: El TDA Grafo
Sumario:
1. Introducción.
2. Definiciones y terminología.
3. Operaciones sobre el TDA Grafo.
4. Algoritmos para el recorrido de grafos. Recorrido en profundidad y a lo ancho.
5. Estructuras de datos para la implementación del TDA Grafo.
Objetivo: Caracterizar el TDA Grafo y sus recorridos.
Bibliografía:
L/T. Capítulo 14. Pág. 353-355
Robert Lafore. Capítulo 13. Pág. 438-449
Peter Drake. Epígrafes 15.1, 15.2
Introducción
En las conferencias anteriores estudiamos las listas, las multilistas y los árboles como
TDA utilizados para la representación y manipulación de la información en la solución
de problemas.
En ocasiones es necesario estructurar la información de modo tal que un nodo pueda
estar relacionado con todos o con casi todos los restantes nodos de la estructura. Es
evidente que ni una lista lineal, ni un árbol, ni una multilista permiten esta característica.
Con las listas se establecen relaciones lineales entre los datos almacenados en los
nodos que las forman. De cada nodo se puede tener acceso a su sucesor (excepto el
último) y a su antecesor (excepto el primero).
Hemos estudiado, además, que en la práctica se presentan problemas en los que los
datos se relacionan de modo no lineal. Estos casos deben ser resueltos con otros tipos
de estructuras y, para ello se introdujeron las multilistasy los árboles.
Las multilistas permiten la representación o modelación de datos relacionados no
linealmente. En este caso se trata de relaciones bidimensionales, tridimensionales, etc.
Las multilistas se componen, entonces, de dimensiones, cada una de las cuales
1
Estructura de Datos II 2021
representa a una de las colecciones de datos que se relacionan a través de ellas. En
este sentido cada nodo puede pertenecer a más de una dimensión y la manipulación
de la información, por lo general, se lleva a cabo a partir de varias de las dimensiones.
Posteriormente vimos que cuando se está en presencia de relaciones no lineales de
tipo jerárquica, se utilizan los árboles, en los que se establecen relaciones entre un
nodo y su padre y entre el nodo y sus hijos. Otra característica de los árboles establece
que cada nodo tiene un único padre, exceptuando al nodo raíz del árbol, que no tiene
padre.
Pero si quisiéramos establecer relaciones entre un nodo y todos los otros dentro de la
estructura esos TDA estudiados no lo permiten. Para ilustrar la necesidad de tal
estructuración de la información, pensemos un ejemplo como el de una red hidráulica.
Una red hidráulica consta de tuberías que distribuyen el agua a diferentes lugares.
Normalmente, las redes hidráulicas se construyen de manera tal que una obstrucción
en uno de sus conductos, ya sea por avería, mantenimiento u otra causa, no implique
una interrupción en el servicio que brinda la red, o sea, se debe poder mantener el
servicio de agua a través de algún otro conducto.
Otro ejemplo pudiera ser el de una red de correo electrónico, en la que cada máquina
tiene diferentes usuarios y cada usuario envía mensajes a otros dentro de la red y
recibe mensajes de otros. El usuario necesita que sus mensajes lleguen a los
destinatarios, independientemente de por cuáles máquinas pasaron estos mensajes.
Muchos ejemplos similares se presentan en la práctica, como la red eléctrica, Internet,
etc. En estos ejemplos se necesitan varios caminos entre un nodo y otro, o se pudiera
requerir el acceso a un nodo a partir de otros.
En este caso, nos estamos refiriendo a los grafos, de los cuales ya se tienen
conocimientos por la asignatura Matemáticas Discretas.
Es importante destacar que en este tema estudiaremos algunos conceptos, que son los
que usaremos en el curso, pero desgraciadamente la terminología para este tipo de
estructura de datos no se ha estandarizado.
2
Estructura de Datos II 2021
Desarrollo
El uso de grafos data de 1736 cuando Leonhard Euler lo usó para resolver el clásico
problema del puente de Könisberg. En este lugar, el río Pregel corre alrededor de la isla
Kneiphof y se divide en dos, por lo que hay cuatro áreas de tierra relacionadas con el
río. Estas cuatro áreas están conectadas entre sí a través de 7 puentes, como se
muestra en la figura.
3
Estructura de Datos II 2021
Observaciones:
- Si el conjunto N es vacío, entonces el grafo será vacío.
- Cada arco de un grafo establece una única relación entre dos nodos.
- No existe restricción alguna en cuanto a la relación que establece un arco entre dos
nodos, o sea, un nodo puede estar relacionado consigo mismo o con otro nodo.
- Cada arco se representará a través de un par, donde cada elemento determina uno
de los nodos relacionados por dicho arco.
Dado que no hay restricciones en cuanto a los arcos de un grafo, todas las estructuras
vistas con anterioridad pueden ser consideradas como un grafo. Esto significa, por
ejemplo, que una lista lineal puede ser vista como un grafo donde cada nodo está
relacionado con uno o dos nodos distintos de él.
Ejemplo de grafo
Grafo:
Este ejemplo muestra un grafo de 5 nodos o vértices y 6 arcos.
A
Vértices del grafo:
B N = {A, B, C, D, F} Los vértices se representan, por lo general,
través de círculos
C D
Arcos del grafo:
F R = {‹A, A›, ‹A, B›, ‹A, D›, ‹A, C›, ‹D, C›, ‹C, F›} Los arcos se
representan como pares ordenados.
4
Estructura de Datos II 2021
no orientados también conocidos como no dirigidos.
Un grafo es no orientado o no dirigido (en inglés notdirected o
notorientedgraph) si el hecho de que el arco (Nj, Nk) pertenezca a R
implica que el arco (Nk, Nj) pertenece a R, para todo j y k.
Esta definición establece que para el grafo no orientado es irrelevante el sentido de las
saetas en los arcos y, al representarlos, los arcos se grafican sin saeta. En otras
palabras, en un grafo no orientado si dos nodos están relacionados entre sí, el arco que
los relaciona aparece una sola vez en el conjunto R de arcos del grafo. Por ejemplo, si
el nodo C está relacionado con el F, entonces el conjunto de arcos debe contener al
par (C, F) y esto denota, también, que el nodo F está relacionado con el C.
Un grafo es orientado o dirigido (en inglés: orientedgraph o directedgraph)
si el hecho de que el arco (N j, Nk) pertenezca a R no implica que el arco
(Nk, Nj) pertenece también a R, para todo j y k.
Para este tipo de grafos el sentido de las saetas en los arcos es importante. Si un nodo
se relaciona con otro a través de un arco, la relación inversa no tiene por qué aparecer
en el conjunto de arcos. Por ejemplo, si el nodo C está relacionado con el F, entonces
el conjunto de arcos debe contener al par (C, F), pero esto no significa que el nodo F
esté relacionado con el C, o sea, el par (F, C) no tiene por qué pertenecer al conjunto
de arcos del grafo.
A este tipo de grafos también se les conoce como digrafos (en inglés:digraph). En este
caso es importante la dirección del arco, por lo que será importante tener en cuenta de
cuál nodo sale el arco, o sea, el nodo origen del arco. De igual modo habrá que tener
en cuenta a cuál nodo llega el arco, es decir, el nodo destino.
Adyacencia
El nodo n es adyacente al m, si existe un arco (arista) de m a n.
Adyacencia:
n adyacente a m
m n
Incidencia
El vértice n es incidente al arco (arista) x, si n es uno de los vértices relacionados por el
5
Estructura de Datos II 2021
arco (arista) x. Del mismo modo, se dice que el arco (arista) x es incidente al vértice n.
De esta manera, todos los arcos que llegan o salen de un nodo son incidentes a él.
Grado de un vértice
El grado de un vértice n es el número de arcos incidentes a él. En el caso de los grafos
orientados, el grado de entrada de un vértice n es el número de arcos que llegan a él y
el grado de salida de un vértice n es el número de arcos que salen de él.
De ahí que el grado de un vértice es la suma de los grados de entrada y de salida del
vértice.
El siguiente ejemplo ilustra el grado, el grado de entrada y el grado de salida de un
vértice en un grafo:
Grado de un nodo:
Este ejemplo muestra un vértice de grado 5.
A
Grado de entrada: 3
Grado de salida: 2
Grado: 5
6
Estructura de Datos II 2021
las ciudades se cumple que la distancia entre una ciudad origen y una ciudad destino y
la distancia de la ciudad destino a la ciudad origen es la misma, entonces, se puede
utilizar un grafo no orientado. Podemos ponderar los arcos con la distancia que existe
entre las ciudades.
Supongamos, por ejemplo, que el agente debe visitar tres ciudades A, B y C, partiendo
de la ciudad A, y que entre las ciudades A y B hay 50 km, que entre las ciudades B y C
hay 20 km y que entre las ciudades A y C hay 15 km.
Teniendo en cuenta estas consideraciones, el grafo quedaría de la siguiente forma:
Problema del agente viajero:
50 km
A B
15 km 20 km
C
Es evidente que el agente recorrerá un camino más corto si, partiendo de A, visita
primero la ciudad C antes que la B.
Grafo ponderado por los vértices
En otros tipos de situaciones es conveniente dar valores de ponderación a los vértices.
Por ejemplo, se tiene una secuencia de actividades, de las que se conoce su duración
y se quiere saber, en un momento dado, en qué orden debieran realizarse, de forma tal
que se realicen primero las de menor duración.
En este caso, las actividades pueden ser representadas por los vértices de un grafo no
orientado y, en cada uno de ellos, puede almacenarse la duración de cada actividad
como factor de ponderación.
Planificación de actividades:
A B
10 25
C
20
7
Estructura de Datos II 2021
Existe un camino de longitud k desde el nodo A al B, si existe una secuencia de k+1
nodos n1, n2, ...,nk+1, donde n1 = A, nk+1 = B y (ni, ni+1) son adyacentes para todo i
entre 1 y k.En el grafo del primer ejemplo:
Entre los nodos A y C:
- camino de longitud 1: (A, C)
- camino de longitud 2: (A, D, C)
- camino de longitud 2: (A, A, C)
- camino de longitud 3: (A, A, D, C)
C D
Entre dos nodos existe un camino simple si todos los
vértices, excepto posiblemente el primero y el último, son F
distintos dos a dos.
En otras palabras, un camino simple es aquel en el que no se repiten los arcos.
Ciclo
8
Estructura de Datos II 2021
9
Estructura de Datos II 2021
ListaDeAyacentes que es IgualA Vértice
Poscondición: ListaDeAdyacentes es una lista
que contiene a todos los vértices adyacentes
a V.
Reemplazar (VerticeViejo, Precondición: El grafo contiene un vértice V1
VerticeNuevo) que es IgualA VerticeViejo y ningún vértice V
del grafo es IgualA VerticeNuevo.
Poscondición: V1 es sustituido por
VerticeNuevo
EsConexo() Retorna verdadero si el grafo es conexo,
retorna falso en caso contrario.
RecorrerALoAncho Poscondición: ListaDeVertices es una lista
(ListaDeVertices) que contiene todos los vértices del grafo en el
orden en que fueron visitados según la
estrategia de recorrido a lo ancho.
RecorrerEnProfundidad Poscondición: ListaDeVertices es una lista
(ListaDeVertices) que contiene todos los vértices del grafo en el
orden en que fueron visitados según la
estrategia de recorrido en profundidad.
MenorCamino(Vertice1,Vertice2, Precondición: El grafo contiene un par de
ListaDelCamino) vértices tal que:
• V1 es IgualA Vértice1
• V2 es IgualA Vértice2
• V1 no es IgualA V2
Poscondición: ListaDelCamino es una lista
que contiene el camino de menor longitud que
va de V1 a V2. Si no hay camino
ListaDelCamino es vacía.
10
Estructura de Datos II 2021
11
Estructura de Datos II 2021
Grafo Tipo
+ EsVacio() : logico
+ NumeroDeVertices() : entero
+ NumeroDeArcos() : entero
+ EstaElVertice( Tipo V ) : logico
+ EstaElArco( Arco<Tipo> A ) : logico
+ InsertarVertice( Tipo V )
+ InsertarArco( Arco<Tipo> A )
+ Eliminar( Tipo V )
+ EliminarArco( Arco<Tipo> A )
+ AdyacentesA( Tipo V ) : Lista<Tipo>
+ Reemplazar( Tipo VViejo, Tipo VNuevo )
+ RecorrerALoAncho() : Lista<Tipo>
+ RecorrerEnProfundidad() : Lista<Tipo>
+ EsConexo() : logico
+ MenorCamino( Tipo V1, Tipo V2 ) : Lista<Tipo>
12
Estructura de Datos II 2021
Hacer la Búsqueda del Primero en Profundidad
partiendo por v.
El algoritmo de la Búsqueda del Primero en Profundidad (BPP) es un algoritmo
recursivo, que recibe como parámetro un vértice v del grafo. El algoritmo BPP(v)
presenta los siguientes pasos:
Paso 1 (Visitar): Marcar v como visitado.
Paso 2 (Recorrer partiendo cada uno de los adyancentes a v):
Para cada w adyacente a v,
Si w no está visitado entonces BPP(w)
13
Estructura de Datos II 2021
Paso 2: Marcar v como visitado.
Paso 3: Adicionar v a Cola.
Paso 4: Mientras Cola no es vacía hacer
4.1) Extraer un vértice de Cola. Sea u el vértice extraído.
4.2) Para cada w adyacente a u hacer
4.2.1) Si w no está visitado entonces
4.2.1.1) Marcar w como visitado
4.2.1.2) Adicionar w a Cola.
Cuando se vayan a programar los métodos de recorrido, hay que tener presente que
estos devuelven una lista con las informaciones de los vértices en el orden en que son
visitados. Por tanto, la acción de visitar se debe interpretar como la adición de la
información del vértice a la lista que se va a retornar.
14
Estructura de Datos II 2021
Representación Lista de Vértices – Matriz de Adyacencia de ungrafo
LV = (a, b, c, d, e)
0 12 3 4
0 1 0 0 1
1
MA= 0
0
1
[ ] 0
0
1
1
0
0
1
1
1
1
0
1
1
1
1
0
0 5 0 0 8
5
MA= 0
0
8
[ 0
0
10
4
0
0
11
3
10
3
0
6
11
6
4
0
]
es el peso de la arista correspondiente , si el vértice de la posicióni en LV
MA i , j=
{ es adyacente al vértice de la posición j
0 en otro caso
15
Estructura de Datos II 2021
anteriormente.
16
Estructura de Datos II 2021
Lista de Vértices – Lista de Adyacencia
La representación Lista de Vértices – Lista de Adyacencia, se compone de una lista
donde se almacenan las informaciones de los vértices del grafo; y una lista que
almacena, para cada uno de los vértices del grafo, los vértices adyacentes a él.
En el siguiente ejemplo se muestra cómo se representa un grafo mediante Lista de
Vértices –Lista de Adyacencia.
LAi = Lista de pares <k, p> donde k es el índice en LV del vértice adyacente al vértice cuya
posición en LV es i, y p es el peso de la arista correspondiente.
17
Estructura de Datos II 2021
Tipo
GrafoNoPonderadoLA
# vertices : Lista<Tipo>
# listaAdy : Lista<Lista<entero>>
+ GrafoNoPonderadoLA()
+ EsVacio() : logico Para el diseño de la clase
+ NumeroDeVertices() : entero
+ NumeroDeArcos() : entero GrafoPonderadoLA, se
+ EstaElVertice( Tipo V ) : logico
+ EstaElArco( Arco<Tipo> A ) : logico sigue la misma idea con la
+ InsertarVertice( Tipo V )
+ InsertarArco( Arco<Tipo> A ) diferencia que la lista de
+ Eliminar( Tipo V )
+ EliminarArco( Arco<Tipo> A )
adyacencia no es de
+ AdyacentesA( Tipo V ) : Lista<Tipo> valores enteros, sino de
+ Reemplazar( Tipo VViejo, Tipo VNuevo )
+ RecorrerALoAncho() : Lista<Tipo> pares <entero, real>.
+ RecorrerEnProfundidad() : Lista<Tipo>
+ EsConexo() : logico La representación de
+ MenorCamino( Tipo V1, Tipo V2 ) : Lista<Tipo>
grafos mediante Lista de
Vértices – Lista de Adyacencia trata de
disminuir un poco el coste espacial significativo de la representación Lista de Vértices –
Matriz de Adyacencia, aunque en el caso peor, en el que el grafo sea completo, el
coste espacial es O(n2) también. Sin embargo, las operaciones son un poco más
costosas en tiempo. Por ejemplo, para determinar si dos vértices son adyacentes es
necesario determinar las posiciones que ocupan en la Lista de Vértices, y luego hacer
una búsqueda secuencial en la lista de adyacentes correspondiente a uno de los
vértices. Esa operación a pesar que tiene un coste temporal O(n), tiene un conjunto
adicional de operaciones que en la variante LV - MA. Complejidad temporal similar
tienen operaciones como Adicionar y Eliminar aristas.
Una operación muy costosa en ambas representaciones es la de eliminar un vértice,
pues implica eliminar todas sus aristas adyacentes, y como eliminar una arista tiene un
coste temporal de O(n), entonces eliminar un vértice tiene un coste temporal de O(n 2).
Ejemplos de aplicaciones de los grafos.
Los grafos tienen múltiples aplicaciones. Un sistema de aeropuertos se puede
18
Estructura de Datos II 2021
modelar con un grafo. Cada aeropuerto es un vértice y las aristas estarían
representadas por los vuelos directos que existen entre un aeropuerto y otro.
Además, se le puede asociar a cada arista un valor real que indique el tiempo de
vuelo, el costo, la distancia, etc. Un grafo de este tipo debería ser dirigido.
También es posible modelar el flujo del tráfico, utilizando grafos. Los vértices serían
las intersecciones de calles y las aristas las calles. El costo de las aristas podría
representar la velocidad máxima, el número de pistas, etc.
Conclusiones
En la conferencia hemos tocado los aspectos fundamentales relacionados con los
TDA grafos, su definición y terminología de la teoría que lo sustenta. También
analizamos formas de representación de los grafos, además de algunas
responsabilidades que deben estar implementadas en una clase que represente
este TDA.
Ejercicio de auto-preparación.
Dado el siguiente grafo:
19