Está en la página 1de 19

Estructura de Datos II 2021

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.

Este problema consiste en determinar si es posible comenzando en una de las cuatro


áreas, pasar por todos los puentes una sola vez y retornar al punto de partida. En este
caso, la respuesta es negativa. Él resolvió el problema representando las áreas de
tierra como vértices y los puentes como aristas en un grafo (actualmente un multigrafo,
porque existe más de un arco entre dos vértices). Esto solo es posible si y solo sí, el
grado de cada vértice, es un número par. Debido a esto, el camino que cumple esta
condición es llamado Euleriano. En la actualidad Könisberg es la ciudad lituana de
Kaliningrado y el río Pregel es llamado Pregolya. Sobre ella se han construido dos
puentes no existentes en la época de Euler, para permitir una solución al histórico
problema. Muchos turistas, sobre todo matemáticos curiosos, acuden cada día a dicha
ciudad para darse un paseo euleriano por la misma.

Definición del T.D.A. Grafo


Un grafo (en inglés: graph) es un T.D.A. que representa un conjunto finito N de nodos,
llamados vértices, relacionados entre sí por un conjunto R de arcos.

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.

Gráficamente los nodos se representan a través de círculos y los arcos a través de


líneas o flechas.
En el grafo anterior el nodo A está relacionado consigo mismo y con los nodos B, C y
D. El nodo B sólo está relacionado con el nodo A. El nodo C está relacionado con los
nodos A, D y F. Por su parte, el nodo D está relacionado con los nodos A y C. Por
último, el nodo F está relacionado con el nodo C.

 Clasificación de los grafos


De acuerdo al tipo de relación que se establecen entre los nodos a través de los arcos,
los grafos suelen clasificarse en grafos orientados, también llamados dirigidos, y grafos

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

 Grafo ponderado o con factor de peso


En muchas aplicaciones resulta de interés asignar valores de ponderación, también
llamados pesos, a los arcos o a los vértices, obteniéndose así grafos de arcos
ponderados o grafos de vértices ponderados, respectivamente.
 Grafo ponderado por los arcos
En aras de entender la necesidad de dar valores de ponderación a los arcos,
analicemos el clásico “problema del agente viajero”.
Un agente necesita repartir paquetes en diferentes ciudades. Se sabe en qué ciudades
el agente debe repartir los paquetes, así como la distancia entre cada ciudad y las
otras. El problema consiste en saber cuál es la mejor ruta a seguir por el agente para
repartir todos los paquetes.
Este problema se puede modelar en forma de grafo, tomando a las ciudades como los
vértices y a los caminos entre las ciudades como los arcos de un grafo. Si para todas

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

En este caso, resultaría conveniente realizar la actividad A, luego la C y, por último, la


B.
También existen los grafos asociados a ambos que son los denominados grafos
ponderados por los vértices y los arcos.
 Camino entre dos nodos

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)

Entre los nodos A y F:


- camino de longitud 2: (A, C, F)
- camino de longitud 3: (A, D, C, F)
- camino de longitud 3: (A, A, C, F)
Grafo:
- camino de longitud 4: (A, A, A, C, F)
En un grafo no orientado, al camino se le llama cadena. A
B
 Camino simple

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

Un ciclo, o también circuito, es un camino simple de cualquier longitud de un nodo a sí


mismo. Si el ciclo es de longitud 1, entonces se denomina bucle o lazo.
 Grafo cíclico

Si un grafo contiene al menos un ciclo se llama cíclico.


 Grafo acíclico

Un grafo acíclico es aquel que no tiene ningún circuito o ciclo.


 Grafo conexo (conectado):
Un grafo es conexo si existe al menos un camino de cualquier vértice a cualquier otro.

8
Estructura de Datos II 2021

 Responsabilidades y operaciones sobre el TDA Grafo


A continuación, veremos las principales responsabilidades y operaciones que se
realizan sobre el TDA Grafo.
Operación Descripción
Crear() Construye un grafo vacío, es decir, un grafo
sin vértices ni aristas.
EsVacio() Retorna verdadero si el grafo es vacío,
retorna falso en caso contrario.
NumeroDeVertices() Retorna el número de vértices del grafo.
NumeroDeAristas() Retorna el número de aristas del grafo.
EstaElVertice (Vertice) Retorna verdadero si existe un vértice en el
grafo IgualA Vertice, es decir, si existe un
vértice en el grafo cuya información es igual a
la información almacenada en Vértice.
Retorna falso en caso contrario.
EstaElArco (Vertice1, Vertice2) Retorna verdadero si el grafo contiene un par
de vértices V1 y V2 tal que:
• V1 es IgualA Vértice1
• V2 es IgualA Vértice2
• <V1, V2> es un arco
en caso contrario retorna falso.
InsertarVertice (Vertice) Inserta en el grafo un nuevo vértice con la
información contenida en Vertice.
InsertarArco (Vertice1, Vertice2) Precondición: El grafo contiene un par de
vértices tal que:
• V1 es IgualA Vértice1
• V2 es IgualA Vértice2
• <V1, V2> no es un arco de G
Poscondición: <V1, V2> pasa a ser un arco
del grafo.
EliminarVertice( Vertice ) Precondición: El grafo posee un vértice V que
es IgualA Vertice
Poscondición: V y todos los arcos en que él
interviene son eliminados del grafo.
EliminarArco (Vertice1,Vertice2) Precondición: El grafo contiene un par de
vértices tal que:
• V1 es IgualA Vértice1
• V2 es IgualA Vértice2
• <V1, V2> es un arco
Poscondición: <V1, V2> deja de ser un arco
en el grafo
AdyacentesA (Vertice): Precondición: El grafo incluye un vértice V

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.

Es necesario señalar que, para el caso de los Grafos Ponderados, la operación


InsertarArco, además de los dos vértices, recibiría como parámetro un valor real que
indica el peso de la arista. También para el caso de los grafos ponderados se pueden
añadir otras operaciones como modificar el peso a una arista, determinar el costo total
de un camino dado del grafo, etc.
Con el objetivo de hacer un diseño jerárquico donde se incluyan tanto los grafos
ponderados como los no ponderados, se diseña previamente una jerarquía de arcos, la
cual se presenta a continuación.

10
Estructura de Datos II 2021

En la siguiente figura se muestra el diseño de una clase abstracta Grafo, además de


las clases herederas GrafoNoPonderado y GrafoPonderado. La clase GrafoPonderado
incluye otra funcionalidad, la de modificar el peso a un determinado arco. Las tres
clases son abstractas, pues aún no presentan la estructura de datos que utilizarían.

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>

 Recorridos en los grafos.


El grafo, como colección de elementos, provee algoritmos para recorrer todo el grafo,
que definen un orden por el cual los vértices son visitados para realizar una
determinada operación sobre la información que éstos tienen almacenada.
En esta sección veremos dos recorridos muy usados en los grafos: el recorrido en
profundidad y el recorrido a lo ancho.
 Recorrido en profundidad
El algoritmo para el recorrido en profundidad presenta los siguientes pasos:
Paso 1 (Inicialización): Para cada v€V
Marcar a v como no visitado.
Paso 2 (Recorrido): Para cada v€V,
Si v no está visitado entonces

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)

El algoritmo BPP es realmente el encargado de realizar la búsqueda de forma recursiva


en el grafo devolviendo el control al algoritmo del recorrido en profundidad solamente
después que todos los vértices no marcados accesibles desde un origen v hayan sido
visitados.
Es necesario hacer notar que para un grafo pueden existir varios recorridos en
profundidad, en dependencia del orden en que se tomen los vértices en el ciclo de
recorrido (paso 2) en el algoritmo del recorrido en profundidad, y en dependencia
también del orden en que se tomen los vértices adyacentes de un vértice v en el ciclo
del paso 2 del algoritmo BPP.
 Recorrido a lo ancho
Otro recorrido es el recorrido a lo ancho, el cual presenta los siguientes pasos:
Paso 1 (Inicialización): Para cada v€V
Marcar a v como no visitado.
Paso 2 (Recorrido): Para cada v€V,
Si v no está visitado entonces
Hacer la Búsqueda del Primero a lo Ancho partiendo por v.
El algoritmo de la Búsqueda del Primero a lo Ancho (BPA) es un algoritmo que recibe
como parámetro un vértice v del grafo. No es recursivo, y para su ejecución se auxilia
de una instancia del TDA Cola, que sería una cola de vértices. El algoritmo BPA(v)
presenta los siguientes pasos:
Paso 1: Cola←Φ

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.

 Estructuras de datos para la implementación del TDA Grafo.


Una estructura de datos para representar grafos debe proveer estructuras para
almacenar las informaciones contenidas en cada uno de los vértices, y estructuras para
almacenar las relaciones entre los vértices, es decir, la existencia o no de aristas
además de sus pesos asociados (en caso que el grafo sea ponderado). Existen varias
estructuras de datos para implementar grafos. En esta conferencia veremos dos de las
más usuales.
 Lista de Vértices – Matriz de Adyacencia
La representación Lista de Vértices – Matriz de Adyacencia, se compone de una lista
donde se almacenan las informaciones de los vértices del grafo, y una matriz que
describe la existencia o no de una arista para cualquier par de vértices.
En el siguiente ejemplo se muestra cómo se representa un grafo mediante Lista de
Vértices –Matriz de Adyacencia.

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

MA i , j= 1 si el vérticede la posicióni en LV es adyacente al vérticede la posición j


{ 0 en otro caso

En el caso de los Grafos Ponderados, en la matriz de adyacencia no se almacenan 0’s


y 1’s, sino que se almacenan los pesos de cada arista. En caso de no existir una arista,
se puede poner un 0.

Representación Lista de Vértices – Matriz de Adyacencia de un grafo ponderado


LV = (a, b, c, d, e)
01 2 3 4

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

En la siguiente figura se muestra el diseño de una clase GrafoNoPonderadoMA (grafo


no ponderado con implementación Lista de Vértices – Matriz de Adyacencia). La clase
GrafoNoPonderadoMA hereda de la clase abstracta GrafoNoPonderado vista

15
Estructura de Datos II 2021
anteriormente.

Para el diseño de la clase GrafoPonderadoMA, se sigue la misma idea con la diferencia


que la matriz de adyacencia es una matriz de valores reales.
La representación de grafos mediante Lista de Vértices – Matriz de Adyacencia permite
un rápido acceso a informaciones concernientes al grafo. Por ejemplo, para determinar
si dos vértices son adyacentes es necesario determinar las posiciones que ocupan en
la Lista de Vértices y el acceso a la matriz es directo. Esa operación tendría un coste
temporal O(n), donde n es la cantidad de vértices del grafo. Complejidad temporal
similar tienen operaciones como Adicionar y Eliminar aristas, que por demás resultan
muy sencillas de programar con esta representación.
Sin embargo, es una representación costosa en cuanto a espacio, pues tiene un coste
espacialde O(n2), debido a que se almacena un valor real por cada par de vértices,
existiendo o no una arista entre ellos. También puede resultar difícil de programar las
operaciones de Adicionar y Eliminar vértices.

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.

Representación Lista de Vértices – Lista de Adyacencia de un grafo


LV = (a, b, c, d, e)
1 2 3 4 5
LA = ( (2, 5),
(1, 4, 5),
(4, 5),
(2, 3, 5)
(1, 2, 3, 4) )
LAi = La lista de las posiciones en LV de los vértices adyacentes al vértice cuya
posición en LV es i.

En el caso de los Grafos Ponderados, esta representación sufre modificaciones: cada


lista de la lista de adyacencia ya no será de índices, sino que será de pares <i, p>
donde i es el índice en LV del vértice adyacente y p es el peso de la arista
correspondiente. A continuación, se muestra un ejemplo:
Representación Lista de Vértices – Lista de Adyacencia de un grafo ponderado

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

En la siguiente figura se muestra el diseño de una clase GrafoNoPonderadoLA (grafo


no ponderado con implementación Lista de Vértices – Lista de Adyacencia). La clase
GrafoNoPonderadoLA hereda de la clase abstracta GrafoNoPonderado.

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:

a) Identifica los caminos simples que existen entre el vértice a y f


b) ¿Es conexo el grafo?
c) Realice el recorrido en profundidad y el recorrido a lo ancho.
d) Represéntelo usando las representaciones Lista de Vértices – Matriz de
Adyacencia y Lista
de Vértices – Lista de Adyacencia.

19

También podría gustarte