ESTRUCTURA DE DATOS
GRAFOS
5.1 Tipo de datos abstracto: Grafo ¿Qué es un Grafo? Es una red de elementos conectados entre sí, un grafo podría explicarse como la red de carreteras de un país que tienen un conjunto de ciudades ciudades conectadas a través de caminos.
Conceptos Grafo: Es un conjunto de nodos y arcos o de vértices y aristas. Nodo o Vértice: Elemento que almacena la información de un grafo. Arco o Arista: Liga que une a dos nodos del grafo. Nodo adyacente: Dos nodos son adyacentes si hay una arista que los conecte. Camino (trayectoria): Secuencia nodos para de ir de un vértice X a un vértice Y. Arista Paralela: Dos aristas son paralelas si comparten los mismos vértices. Arista Incidente o Lazo: Es aquella arista que se dirige al vértice desde el cual partió. Vértice Aislado: Es aquel vértice en el cual no incide ninguna arista. Ciclo: Es el camino donde el vértice de inicio i nicio y el de terminación son el mismo y no hay aristas repetidas.
Camino (trayectoria) Simple: Camino donde el vértice de inicio es diferente al vértice de terminación y no se repite el paso por ningún vértice. Grado de un vértice: Cantidad de aristas que inciden sobre ese vértice. Grado de un grafo: Es el máximo grado que pueden tener sus vértices, el cual es la cantidad de aristas que inciden en el vértice. Se representa con la letra delta minúscula:
Tipos de Grafos Grafo simple: Es un grafo sin lazos ni aristas paralelas. Grafo no dirigido: En un grafo no dirigido las aristas no tienen una dirección particular, por lo que si el vértice A y el vértice B son adyacentes, es igual ir de A hacia B que de B hacia A.
Grafo dirigido (Digrafo): En un dígrafo las aristas tienen una dirección asociada, la primer arista es el origen y la segunda (quien es apuntada por la flecha) es considerada el destino.
Grafo completo: Es en el cual existe un camino desde cualquier vértice hacia todos los demás vértices del grafo.
Grafo Ponderado: Es el grafo en el cual cada arista tiene asignado un peso o valor real no negativo.
Ejemplo 1: Conjunto de Vértices: V={v1, v2, v3, v4}
Aa2
v1
v2 Aa4
Aa5 Aa3
Conjunto de Aristas:
a={a1, a2, a3, a4, a5}
Aa4 v4 v3
v1
Aa1
Aa2 v2
Este grafo es un grafo Simple
Este grafo es un grafo no dirigido
Caminos para recorrer de v1 hacia v4 en este grafo:
v1 y v2 son nodos Adyacentes
- v1, v2, v4 - v1, v4 - v1, v3, v4 - v1, v2, v1, v4
Ejemplo 2: Aa2
v1
v2
Aa1
Aa3 v4
Este grafo es un grafo dirigido ya que sus aristas están direccionadas.
Ejemplo 3: Aa4
v3
Aa3 v1
Aa1
a1 y a2 son aristas paralelas
La arista a4 es un lazo
El vértice v4 es un vértice aislado
v4
Aa2
v2
Ejemplo 4:
v2
- v1, v2, v3, v4, v5, v1
v3
Aa1
Ciclos:
- v5, v1, v2, v4, v5 Aa3 Aa5
- v3, v2, v4, v3 - v1, v2, v3, v4, v2, v1 (no es ciclo ya que se repite la arista a4)
Aa4 v4
v1
Aa2
Aa6
Caminos Simples:
- v1, v2, v3 - v1, v5, v4, v2, v3 - v1, v2, v4, v3
v5
- v1, v2, v4, v5, v1, v2, v3 (no es un camino simple ya que se repiten los vértices v1 y v2
Ejemplo 5:
Este grafo es un grafo Completo
El grado del grafo:
El grado del vértice v5:
El grafo es un grafo ponderado ya que cada arista tiene
v3 v2
v4
v1
(grafo)= 4. (v5)= 4.
v5
Ejemplo 6: Chihuahua
A820 km Coahuila
A700 km
A550 km Durango
asignado un valor en este caso son kilómetros de distancia.
5.2 Estructuras de datos para grafos 5.2.1 Estructura de Matriz de Adyacencias Una de las representaciones más sencillas de un grafo es la denominada Matriz de adyacencias que consiste básicamente en:
Un arreglo bidimensional de tamaño nxn, donde n es la máxima cantidad de nodos del grafo.
Las casillas de la matriz se llenan con verdadero y falso o con 0 y 1 según exista o no un arista que conecte a los 2 nodos involucrados
Para el caso de los grafos no dirigidos, la matriz será simétrica, sin embargo esto no ocurre en los dígrafos donde se debe considerar la dirección explicita de cada uno arcos.
Para el caso de los grafos ponderados, la matriz se puede llenar con el peso asociado a cada una de las aristas.
Ejemplos: #1.- Grafo no dirigido
A
Matriz de Adyacencias
D
C
A
B
C
D
E
A
0
0
1
1
1
B
0
1
1
1
0
C
1
1
0
0
0
D
1
1
0
0
1
E
1
0
0
1
0
B
E
#2.- Grafo dirigido (Digrafo)
A
D
C E
Matriz de Adyacencias
B
A
B
C
D
E
A
0
0
0
1
1
B
0
1
0
0
0
C
1
1
0
0
0
D
0
1
0
0
0
E
0
0
0
1
0
5.2.2 Estructura de Lista de adyacencias Consiste en definir una lista encadenada de nodos y a cada uno de ellos enlazarlos con su lista de nodos adyacentes. La idea es la similar a la matriz de adyacencias pero se busca ahorrar un poco de espacio en la memoria al no definir las casillas para nodos que no tienen arcos.
Nodo
Apuntador al nodo adyacente
Apuntador al siguiente nodo
Ejemplos: #1.- Grafo no dirigido
A
Lista de Adyacencias
D
C
B
A
C
D
B
C
D
C
A
B
D
A
B
E
A
D
E
E
E
#2.- Grafo dirigido (Digrafo)
Lista de Adyacencias
A A
D
E
C
A
B
D
B
E
D
D
B C
B
E
5.2.3 Estructura de lista de arcos/aristas Se usa preferentemente en los dígrafos (grafos dirigidos). En esta representación se mantiene una lista de nodos (al igual que en la lista de adyacencias) pero en lugar de almacenar los nodos vecinos, se crea una lista para cada una de las aristas para cada nodo, en el cual se mantiene la información necesaria para determinar cual nodo es el origen de la arista y cuál es el destino. En esta estructura se minimiza el desperdicio de espacio en memoria pero el grado de complejidad crece a medida que se aumenta la cantidad de nodos
Nodo
Apuntador al arco donde el nodo es o rigen A untador al arco donde el nodo es destino
Apuntador al siguiente nodo adyacente
Ejemplo:
A
D
C
B
E
A-D
A-E
C
C-A
C-B
D
D-B
E
E-D
A
B
5.3 Recorridos de un Grafo Una de las operaciones básicas en el manejo de grafos es su recorrido, existen diferentes algoritmos para realizar esa operación. Dos métodos conocidos son el de Búsqueda en Profundidad y el de Búsqueda en Anchura. En ambos casos, debido a que es posible visitar el nodo más de una vez, es necesario marcar el nodo visitado como tal.
5.3.1 Búsqueda en profundidad El algoritmo se puede plantear de forma recursiva tomando como punto de partida el nodo i, (nodo con la menor información) visitándolo, marcándolo como visitado y seguir con los sucesores del nodo i usando la búsqueda en profundidad para visitarlos y marcarlos continuando recursivamente. Para manejar este algoritmo se utilizara una pila para guardar los nodos antes de ser visitados y una Lista para guardarlos una vez visitados.
Ejemplo:
3 2
4
1
5
Algoritmo de la Búsqueda en Profundidad explicada con el grafo anterior: 1.
El recorrido comenzara con el nodo 1 (N1).
2.
Insertar N1 en la pila de nodos sin visitar.
Pila de nodos sin visitar
Lista de nodos Visitados
Inicio
TOPE
N1
3.
Sale N1 de la pila, se visita y se coloca en la lista de nodos visitados. (El algoritmo termina en el momento en que se vayan a sacar nodos de la pila y esta se encuentre vacía).
3
Pila de nodos sin visitar
Lista de nodos Visitados
2
4
Inicio
N1
1
5
Visitado TOPE 4.
Se insertan en la pila los nodos sucesores de N1, respetando su orden.
Pila de nodos sin visitar
Lista de nodos Visitados
Inicio
TOPE
N5
N1
N4 N2
5.
Sale de la Pila N5, se visita y se verifica que no esté en la lista de nodos ya visitados, si no lo esta se inserta en ella.
3
Pila de nodos sin visitar
2
Lista de nodos Visitados
4
Inicio
N1 TOPE
N4 N2
1 Visitado
N5
5 Visitado
Ultimo
Nodo
nodo
agregado
visitado
en este
antes de
paso.
este paso
6.
Se agregan los sucesores de N5 a la Pila, en este caso solo tiene uno el cual es N4.
Pila de nodos sin visitar
Lista de nodos Visitados
Inicio
TOPE
N4
N1
N5
N4 N2
7.
Sale N4 de la Pila, se visita y se verifica que no esté en la lista de nodos visitados, N4 no está e n la lista por lo tanto se puede agregar a ella.
3 Pila de nodos sin visitar
Lista de nodos Visitados
2
4
Inicio
N1 TOPE
N4 N2
1
N5
N4
5
Visitado
Visitado
Ultimo
Nodo
nodo
agregado
visitado
en este
antes de
paso.
este paso 8.
En el caso de N4 no tiene sucesores por lo tanto la pila no se modifica en este paso.
9.
Sale el siguiente elemento de la Pila, ahora es N4, se visita y se verifica si ya está en la pila de nodos visitados, en este caso sí lo está por lo tanto no se incluye otra vez en la Lista ni se agregan sus sucesores en la Pila.
3 Pila de nodos sin visitar
Lista de nodos Visitados
2
4
Inicio
N1
1 TOPE
N2
Visitado
N5
N4
5 Visitado
Ultimo nodo visitado antes de este paso
10. Sale N2 de la pila, se visita y se verifica si se encuentra en la lista de nodos visitados, si no lo e stá, se agrega a dicha lista.
3 Pila de nodos sin visitar
Lista de nodos Visitados
2
4
Inicio
N1
1
N4
N2
5
Visitado
TOPE
N5
Visitado
Ultimo
Nodo
nodo
agregado
visitado
en este
antes de
paso.
este paso 11. Se agregan los sucesores de N2 (los cuales son N3 y N5) a la Pila de nodos sin vistar.
Pila de nodos sin visitar
Lista de nodos Visitados
Inicio
N1 TOPE
N5
N4
N2
N5 N3
12. Sale N5 de la Pila, se visita y se verifica si se encuentra en la lista de nodos visitados, N5 ya e stá en la lista por lo tanto no se agrega de nuevo, ni sus sucesores se agregan a la pila de nodos sin visitar.
3 Pila de nodos sin visitar
Lista de nodos Visitados
2
4
Inicio
N1
1 TOPE
N3
Visitado
N5
N4
N2
5 Visitado
Ultimo nodo visitado antes de este paso
13. Sale N3 de la Pila, se visita y se verifica que no se encuentre en la lista de nodos visitados, N3 no e sta en la lista por lo tanto puede agregarse.
3 Pila de nodos sin visitar
Lista de nodos Visitados
2
4
Inicio
N1
1
N5
N4
N2
N3
5
Visitado
Ultimo
Visitado
TOPE
nodo visitado antes de este paso
Nodo agregado en este paso.
14. Se agrega N4 a la pila ya que es el único sucesor de N3.
Pila de nodos sin visitar
Lista de nodos Visitados
Inicio
N1
TOPE
N5
N4
N2
N3
N4
15. Sale N4 de la Pila, se visita y se verifica que no esté en la lista de nodos visitados, N4 ya está e n la lista por lo tanto no se puede agregar.
Lista de nodos Visitados
3 Pila de nodos sin visitar
Inicio
2
4 N1
1
5
N5
N4
N2
N3
Ultimo nodo
Visitado TOPE
Visitado
visitado antes de este paso
16. Ya no hay nodos en la Pila, por lo tanto el algoritmo termina teniendo en la lista de nodos visitados el resultado del recorrido en profundidad.
Pila de nodos sin visitar Lista de nodos Visitados Inicio
N1
N5
N4
N2
N3
BUSQUEDA EN PROFUNDIDAD TOPE
3 2
4
1
5
5.3.2 Búsqueda en Anchura En este método se parte del nodo i (nodo con menor información), visitándolo, marcándolo como visitado y luego se realiza el mismo método con los nodos sucesores del nodo i continuando recursivamente. Se examina si todos los nodos fueron visitados y si no selecciona uno de los nodos que falta visitar y se continúa con el proceso hasta que todos los nodos se hayan visitado. Para manejar este algoritmo se utilizara una Fila para guardar los nodos antes de ser visitados y una L ista para guardarlos una vez visitados.
Ejemplo:
3 2
4
1
5
Algoritmo de la Búsqueda en Profundidad explicada con el grafo anterior: 1.
El recorrido comenzara con el nodo 1 (N1).
2.
Insertar N1 en la lista de nodos sin visitar.
Fila de nodos sin visitar
Lista de nodos Visitados
Inicio Fin
Inicio
N1
3.
Sale N1 de la Fila, se visita y se coloca en la lista de nodos visitados. (El algoritmo termina en el momento en que se vayan a sacar nodos de la Fila y esta se encuentre vacía).
3
Fila de nodos sin visitar Inicio Fin
2
Lista de nodos Visitados
4
Inicio
N1
1 Visitado
5
4.
Se insertan en la Fila los nodos adyacentes de N1, respetando su orden.
Lista de nodos Visitados
Fila de nodos sin visitar Fin
Inicio
N2
5.
N4
Inicio
N5
N1
Sale de la Fila N2, se visita y se verifica que no est é en la lista de nodos ya visitados, y como no lo está, se inserta en ella.
3
Lista de nodos Visitados
Visitado Fila de nodos sin visitar Inicio
2
4
Inicio
Fin N1
N4
N5
1
N2
5
Visitado
Ultimo
Nodo
nodo
agregado
visitado
en este
antes de
paso.
este paso 6.
Se agregan los nodos sucesores de N2 a la Fila, en este caso son N3 y N5.
Fila de nodos sin visitar Inicio
N4
N5
N3
Lista de nodos Visitados
Fin
Inicio
N5
N1
N2
7.
Sale N4 de la fila, se visita y se verifica que no esté en la lista de nodos visitados, N4 no está en la lista por lo tanto se puede agregar a ella.
3 Lista de nodos Visitados Fila de nodos sin visitar Inicio
2
4
Inicio
Fin N1
N5
N3
N5
1
N2
N4
5
Visitado
Ultimo
Nodo
nodo
agregado
visitado
en este
antes de
paso.
este paso 8.
En el caso de N4 no tiene sucesores por lo tanto la Fila no se modifica en este paso.
9.
Sale el siguiente elemento de la Fila, ahora es N5, se visita y se verifica si ya está e n la pila de nodos visitados, N5 no está en la Lista por lo tanto puede agregarse.
3 Lista de nodos Visitados
Fila de nodos sin visitar Fin
Inicio
N3
2
Inicio
4
N1
N5
1
N2
N4
5
Visitado
Ultimo
Nodo
nodo
agregado
visitado
en este
antes de
paso.
este paso 10. Se agregan los nodos sucesores de N5 a la Fila, en este caso solo tiene uno: N4.
Fila de nodos sin visitar Inicio
N3
Fin
N5
N4
N5
Lista de nodos Visitados
Inicio
N1
N2
N4
N5
11. Sale N3 de la Fila, se visita y se verifica si se encuentra en la lista de nodos visitados: N3 no está en la lista por lo tanto se agrega.
Lista de nodos Visitados
3 Fila de nodos sin visitar Inicio
Inicio
Fin
N5
2
4
1
5
N1
N2
N4
N5
N3
N4 Ultimo
Nodo
nodo
agregado
visitado
en este
antes de
paso.
este paso
12. Se agregan los nodos sucesores de N3 a la Fila, en este caso solo tiene uno: N4.
Lista de nodos Visitados
Fila de nodos sin visitar Inicio
N5
Fin
N4
Inicio
N4
N1
N2
N4
N5
N3
13. Sale N5 de la Fila, se visita y se verifica si se encuentra en la lista de nodos visitados, N5 ya está en la lista por lo tanto no se agrega de nuevo, ni sus sucesores se agregan a la Fila de nodos sin visitar.
3 Fila de nodos sin visitar Inicio
N4
Fin
Lista de nodos Visitados
2
4
Inicio
N4 N1
1 Visitado
N2
N4
N5
N3
5 Visitado
Ultimo nodo visitado antes de este paso
14. Sale N4 de la Fila, se visita y se verifica si se encuentra en la lista de nodos visitados, N4 ya está en la lista por lo tanto no se agrega de nuevo.
3 Fila de nodos sin visitar
Lista de nodos Visitados
Inicio Fin
2
4
Inicio
N4 N1
1
N2
N4
N5
N3
5
Visitado
Ultimo
Visitado
nodo visitado antes de este paso 15. Sale N4 de la Fila, se visita y se verifica si se encuentra en la lista de nodos visitados, N4 ya está en la lista por lo tanto no se agrega de nuevo.
3 Fila de nodos sin visitar Inicio
Fin
Lista de nodos Visitados
2
4
Inicio
N1
1
N2
N4
N5
N3
5
Visitado
Ultimo
Visitado
nodo visitado antes de este paso 16. La Fila ya no contiene nodos lo que significa que todos fueron visitados, en la lista de nodos visitados se encuentra la Búsqueda en Anchura
Fila de nodos sin visitar Inicio Fin
Lista de nodos Visitados
3
Inicio
N1
N2
N4
N5
2
4
1
5
N3
BUSQUEDA EN ANCHURA