Estructuras de Datos GRAFOS (parte 1)
–
2016
Introducción
2
Los grafos sirven para representar relaciones arbitrarias (no necesariamente jerárquicas) jerárquicas) entre objetos de datos
1
Grafos Introducción a la teoría de grafos
M.C. Yalú Galicia Hdez. (FCC/BUAP)
3
Aplicaciones Circuitos electrónicos Tarjetas impresas Circuitos integrados Redes de transporte Autopistas Vuelos Redes de ordenadores LANs Internet Web Planeación (rutas críticas) Planificación de las tareas que completan un proyecto Redes sociales
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Ejemplo de uso de Grafos
4
En una red de carreteras l as poblaciones representan los vértices del grafo y las carreteras de unión de dos poblaciones, los arcos, de modo que a cada arco se asocia información tal como la distancia entre dos ciudades, el consumo de gasolina por automóvil, etc. Teziutlan Atlixco
3 Chignahuapan Puebla
2 1 2.5
2 Tehuacán
Zacapoaxtla 5
M.C. Yalú Galicia Hdez. (FCC/BUAP) M.C. Yalú Galicia Hdez. (FCC/BUAP)
Zacatlán
Estructuras de Datos GRAFOS (parte 1)
–
2016
Definiciones
5
Definiciones
6
Un grafo consiste en un conjunto de vértices o nodos (V) y un conjunto de arcos o aristas (A). Un grafo se representa con el par G = (V,A).
El número de elementos de V se llama orden del grafo Un grafo nulo es un grafo de orden cero
Un grafo no dirigido es aquel que los arcos están formados por pares de nodos no ordenados, se representa u v. Si (u,v) es una arista en el conjunto de aristas del grafo A(G), entonces u y v se dice que son vértices adyacentes.
Un arco o arista está formado por un par de nodos u y v, y se representa por (u,v)
Un grafo es dirigido (o digrafo) si los pares de nodos que forman los arcos son ordenados y se representan u v.
Un arco tiene, a veces, asociado un factor de peso, en cuyo caso se dice que es un grafo valorado o ponderado.
M.C. Yalú Galicia Hdez. (FCC/BUAP)
7
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Fundamentos: grafos dirigidos
Grafo no dirigido
Grafo dirigido
V(G1) = {a,b,c,d}
V(G2) = {1,3,5,7,9}
A(G1) = {(a,b),(a,d),(b,c),(b,d)}
A(G2) = {(1,3),(3,1),(9,1), (3,5),(5,7)}
Adyacentes a a: b, d
Fundamentos
8
Grado de un vértice (o nodo)
En un grafo no dirigido
En un grafo dirigido
Adyacentes a 1: 3
Adyacentes a b: a, c, d
Adyacentes a 3: 1, 5
9 1
a
7 c
Grado de entrada de u = nº de arcos que llegan a u
Grado de salida de u = nº de arcos que salen de u
M.C. Yalú Galicia Hdez. (FCC/BUAP)
3 5
d
Grado de un nodo u = nº de aristas que contienen a u
3
b
Es decir, dos vértices son adyacentes si hay un arco que los une.
9
5 1 7
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Grado entrada/salida para: 3? 9? 1? 5?
Estructuras de Datos GRAFOS (parte 1)
Fundamentos
9
2016
–
Grafos conexos
Fundamentos
10
Grafos Completos
Un grafo no dirigido es conexo si existe un camino entre cualquier par de nodos que forman el grafo
Ejemplos:
grafo conexo •
grafo no conexo con dos componentes conexas
Si existen n vértices, habrá (n-1) aristas en un grafo completo y dirigido, y n(n-1)/2 aristas en un grafo no dirigido completo. Ejemplos:
Grafos fuertemente conexos
Un grafo dirigido es fuertemente conexo si existe un camino entre cualquier par de nodos que forman el grafo Ejemplos:
Grafo completo no dirigido
M.C. Yalú Galicia Hdez. (FCC/BUAP)
11
Un grafo completo es aquel en que cada vértice está conectado con todos y cada uno de l os restantes nodos.
Un grafo con V vértices tiene a lo más V (V – 1)/2 aristas
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Grafo completo dirigido
Prueba: El total de V2 posible pares de vértices incluyen los vértices con bucles y cuentan doble para cada par de vértice distinto, entonces el número de aristas es a lo más
( V2 – V )/2 = V (V – 1)/2.
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Fundamentos: camino
12
Un camino P de longitud n en el grafo G desde u0 a un es la secuencia de n+1 vértices P = (u0, u1, ..., un) tal que (ui,ui+1) son arcos de G para 0 i n Un camino es simple si todos los nodos que forman el camino son distintos, pudiendo ser iguales los extremos del camino Ejemplo:
P1 es simple
P2 no es simple M.C. Yalú Galicia Hdez. (FCC/BUAP)
a
V
b
d
U c
P2
P1 X
e
W
g f
Y
h
Z
Estructuras de Datos GRAFOS (parte 1)
2016
Actividad Individual
Fundamentos: ciclos y bucles
13
–
Un ciclo es un camino simple cerrado con u0=un, compuesto al menos por tres nodos Un ciclo es simple si todos sus vértices y arcos son distintos Un arco que va desde un vértice a sí mismo (u,u) se denomina bucle o lazo
a U c
V
14
b
d
X
C2
e
h
Z
C1
W
g
f
Y
Obtener todos los caminos de vértice 1 al 4 y del 4 a cualquier otro vértice
3
Determinar cual de ellos es simple
2
Hay cliclos? Cual? ¿Se trata de un grafo conexo?
1
Ejemplo
C1 es un ciclo simple
C2 es un ciclo no simple
4
M.C. Yalú Galicia Hdez. (FCC/BUAP)
TAD GRAFO
15
Composición:
:: = {} + {}
::= <> + [<>]
::= <> + <>
:: = {} + {}
6 5
M.C. Yalú Galicia Hdez. (FCC/BUAP)
TAD GRAFO: Operaciones 16
Creación del grafo
crearGrafo (grafo)
Inserción de vértices
insertarVertice(grafo, vertice)
Eliminación de vértices
borrarVertice(grafo, referenciaVertice)
Inclusión de aristas
insertarArista(grafo, vertice1, vertice2)
B or ra r a ri st as
bo rr ar Ar is ta (g raf o, ar is ta)
Recorrido del grafo
recorrer(grafo,tipoRecorrido)
::= <> + [<>] ::= <> + <> + <>
M.C. Yalú Galicia Hdez. (FCC/BUAP)
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Estructuras de Datos GRAFOS (parte 1)
–
2016
TAD GRAFO: Operaciones info(referenciaVertice) Informacion grado(referenciaVertice) Entero
Acceso a los vertices
gradoEntrante(referenciaVertice) Entero gradoSaliente(referenciaVertice) Entero
adyacentes(referenciaVertice) incidentes{referenciaVertice)
{referenciaVertice} {referenciaVertice}
esAdyacente(refenciaVertice1, referenciaVertice2)
Modificación de vertices
Representación de GRAFOS
18
Boolean
Matriz de adyacencias Sea G = (V,A) un grafo de n nodos, suponemos que los nodos V = {u1,...,un} están ordenados y podemos representarlos por sus ordinales {1,2,...,n}. La representación de los arcos se hace con una matriz A de nxn elementos aij definida: 1 si hay arco (ui,uj)
asignarInfo(referenciaVertice, valorInformacion)
aij vertices(referenciaArista)
Acceso a las aristas
etiqueta((referenciaArista)
Modificación de aristas
19
3
asignarEtiqueta(referenciaArista, valorEtiqueta)
1
1 5
4
0 1 0 0 0
0 0 0 0 1
0 1 1 1
1 0 0 1
M.C. Yalú Galicia Hdez. (FCC/BUAP)
1 0 0 0
1 1 0 0
Obtén la matriz de adyacencia para el siguiente grafo.
a b
3 0 0 1 0 0
f 4
0 0 0 0 0
20
1
2 4
Actividad Individual
5
6
1
En resumen, la matriz de adyacencia a es un arreglo de dos dimensiones que representa las conexiones entre pares de vértices. M.C. Yalú Galicia Hdez. (FCC/BUAP)
2
2
2
1 0 1 0 0
etiqueta
Representación: matriz de adyacencia 3 2
1
0 0 0 0 0
0 si no hay arco (ui,uj)
(refVertice, refVertice)
destino(referenciaArista) refVertice origen(referenciaArista) refVertice
1 0 6 0 0
0 2 0 0 0
0 0 0 0 1
0 0 2 0 0
e
c M.C. Yalú Galicia Hdez. (FCC/BUAP)
d
Estructuras de Datos GRAFOS (parte 1)
–
2016
Grafo
-M[][]: int 22 ListaLigada -vertices:
Actividad individual 21
Deducir la matriz de adyacencia para el siguiente grafo con aristas ponderadas. 8
1 15 4
10
3
2
7
34
5 12
5
11 6
98
ListaLigada
-inicio: Nodo
+Grafo() +Grafo(n: int) +agregarVertice(v: String): boolean +eliminarVertice(v: String) ): boolean +agregarArista(vo: String, vd: String) +eliminarArista(vo: String, vd: String) +mostrarMatriz(): void +mostrarVertices(): void +getOrden(): int +getGrado(vertice: String): int
20
74
2 7
Nodo
7 9 8
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Representación
23
+Nodo() M.C. Yalú Galicia Hdez. (FCC/BUAP) +Nodo(v: vertice)
Representación: listas de adyacencia
24
Poco eficiente si el nº de vértices varía a lo largo del tiempo de vida del grafo
Puede darse el caso de que el nº de vértices sea mayor del previsto inicialmente
Ejemplo
3
Poco eficiente cuando el grafo tiene pocos arcos (la matriz es “dispersa”)
2
Listas de adyacencia
Representar una lista de todos los vértices
1
Cada vértice guarda una lista de adyacencia con un objeto arista para cada vértice alcanzable desde él
1
3
2
3
3
1
4
4 5 5
4 M.C. Yalú Galicia Hdez. (FCC/BUAP)
Vertice
+Vertice(nombre: string) +Vertice(nombre: string, index) +getIndex(nombre: string): int +getNombre(): String
vertice: Vertice sgte: Nodo
Matriz de adyacencia
-nombre: String -index: int
8 15
+ListaLigada() +insertar(v: Vertice): boolean +eliminar(v: Vertice): boolean +eliminar(index: int): boolean +mostrar(): void
M.C. Yalú Galicia Hdez. (FCC/BUAP)
1
2
4
Estructuras de Datos GRAFOS (parte 1)
–
2016
Actividad Individual 26
Representación: listas de adyacencia
25
3
Ejemplo 7
2
2
1
3 2
2
3 7
Obtener la lista de adyacencia para el siguiente grafo.
a
h i
g
3
5
b 2
1
1 1
4
c
5
1
4
5
3
3 5
2 2
4 3
j M.C. Yalú Galicia Hdez. (FCC/BUAP)
Actividad individual
27
28
¿Que hemos aprendido?
Obtener la lista de adyacencia para el siguiente grafo con aristas ponderadas.
2
8
1 15
7
4
12
5
6
5 15
7
20 7
M.C. Yalú Galicia Hdez. (FCC/BUAP)
f
e
M.C. Yalú Galicia Hdez. (FCC/BUAP)
d
2 8 M.C. Yalú Galicia Hdez. (FCC/BUAP)
Estructuras de Datos GRAFOS (parte 1)
–
2016
Recorridos en Grafos
30
29
Algoritmos de búsqueda o recorridos en grafos
Muchas de las aplicaciones computacionales naturalmente incluyen no solo un conjunto de elementos sino un conjunto de conexiones entre pares de esos elementos Las relaciones implicadas por esas conexiones guían inmediatamente a un conjunto de preguntas:
Profundidad y anchura
M.C. Yalú Galicia Hdez. (FCC/BUAP)
31
Algoritmos de búsqueda o recorridos en grafos
Recorrer un grafo consiste en pasar exactamente una vez por cada uno de los vértices del grafo en busca de algún vértice en particular.
Recorrido o búsqueda primero en achura – BFS (Breadth-First Search)
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Marcar vértice como visitado
Si los vértices están identificados por algún tipo ordinal, emplear un conjunto que contenga los identificadores de los vértices visitados
Encontrar los vértices adyacentes Con matrices de adyacencia: recorrer la fila correspondiente al vértice, buscando columnas igual a1 Con listas de adyacencia: recorrer la lista
¿Cual es la mejor manera de ir desde un elemento a otro?
Recorridos: operaciones auxiliares
32
Existen varias formas de realizar este proceso dependiendo del objetivo particular: Recorrido o búsqueda primero en profundidad – DFS (Depth-First Search)
¿Cuántos otros elementos pueden ser alcanzados desde un elemento dado?
M.C. Yalú Galicia Hdez. (FCC/BUAP)
¿Hay alguna manera de ir de un elemento a otr o siguiendo las conexiones?
Estructuras auxiliares
TDA Pila en Profundidad TDA Cola en Anchura
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Estructuras de Datos GRAFOS (parte 1)
–
2016
Recorrido primero en profundidad
Recorridos
33
2
Primero en profundidad (DFS: Depth First Search) Visitar vértice adyacente a vi
... proceder así hasta encontrar uno ya visitado...
1 2 3 4 5 6 7 8 9 10 11 12 13
2
0 1 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0 0
11
11
12
9
Volver atrás hasta llegar a un vértice con adyacentes sin visitar
13 13
8 5 8
2
El recorrido termina cuando v olviendo atrás llegamos al vértice inicial vi y no quedan adyacentes por recorrer
5
7
6
9
12
1, 3, 6, 10, 13, 12, 9, 5, 2, 4, 7, 8, 11
Actividad Individual
Recorrido primero en profundidad 3
4
5
6
7
8
9 10 11 12 13
1 0 0 1 0 1 1 0 0 0 0 0 0
1 1 1 0 0 1 1 1 0 0 0 0 0
0 1 0 0 0 0 0 1 1 0 0 0 0
0 0 1 1 0 0 0 0 0 1 0 0 0
0 0 1 1 0 0 0 0 0 1 0 0 0
0 0 0 1 1 0 0 0 0 0 1 0 0
0 0 0 0 1 0 0 0 0 0 1 1 0
M.C. Yalú Galicia Hdez. (FCC/BUAP)
4
4
M.C. Yalú Galicia Hdez. (FCC/BUAP)
1
10 7 10
3
6
1
Visitar vértice inicial vi
3
1
0 0 0 0 0 1 1 0 0 0 1 0 1
0 0 0 0 0 0 0 1 1 1 0 0 1
0 0 0 0 0 0 0 0 1 0 0 0 1 35
0 0 0 0 0 0 0 0 0 1 1 1 0
1 2 4 3 6 10 7 11 8 5 9 12 13
Obtener la matriz de adyacencia y el recorrido DFS del siguiente grafo. Inicia en el nodo a
a
h i
g b c
d
f j
e
Estructuras de Datos GRAFOS (parte 1)
2016
Recorrido primero en profundidad
37
–
Solución a b c d e f g h i j
a
b
0 0 1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
c d 0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
e f 0 0 1 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 1 0
g 1 0 0 0 0 1 0 0 0 0
h i 0 0 0 0 0 0 1 0 0 0
M.C. Yalú Galicia Hdez. (FCC/BUAP)
0 0 0 0 0 0 0 1 0 0
j 0 0 0 0 0 1 0 0 1 0
Primero en anchura (BFS: Breadth First Search)
Visitar vértice inicial vi
Visitar todos los vértices adyacentes a vi
Al terminar, comenzar a visitar los adyacentes a los adyacentes a vi ... proceder así hasta que no queden vértices por visitar
M.C. Yalú Galicia Hdez. (FCC/BUAP)
En binas escribir el algoritmo Primero en profundidad (DFS: Depth First Search)
a b c e d f g h i j
Recorridos
39
Actividad colaborativa
38
Tip: Pensar recursivamente
M.C. Yalú Galicia Hdez. (FCC/BUAP)
40
Recorridos: Anchura Inicio marcar vi como visitado meter vi en cola Q mientras cola Q no vacía hacer sacar v de cola Q para cada vk adyacente a v hacer si vk no visitado entonces marcar vk visitado meter vk en cola Q fin_si fin_para fin_mientras Fin M.C. Yalú Galicia Hdez. (FCC/BUAP)
Estructuras de Datos GRAFOS (parte 1)
–
2016
Recorrido primero en anchura 4
3
1
1
5
8
6
10
7
2
4
3
42
11
6
9
11
13
8 7
2
5
10
12
12
9
1 2 3 4 5 6 7 8 9 10 11 12 13
1
2
0 1 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0 0
1, 3, 4, 2, 6, 7, 8, 5, 10, 11, 9, 13, 12
44 En binas obtener la matriz de adyacencia y el recorrido del grafo en anchura
a
3
4
5
6
7
8
9 10 11 12 13
1 0 0 1 0 1 1 0 0 0 0 0 0
1 1 1 0 0 1 1 1 0 0 0 0 0
0 1 0 0 0 0 0 1 1 0 0 0 0
0 0 1 1 0 0 0 0 0 1 0 0 0
0 0 1 1 0 0 0 0 0 1 0 0 0
0 0 0 1 1 0 0 0 0 0 1 0 0
0 0 0 0 1 0 0 0 0 0 1 1 0
h
c
d
-M[][]: int -V[]: vertice
f j
e
0 0 0 0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 1 1 1 0
1 2 3 4 5 6 7 8 9 10 11 12 13
En equipos de 4, suponiendo que se cuenta con la clase Grafo como se muestra. Implementar los recorridos en profundidad y anchura Grafo
b
0 0 0 0 0 0 0 1 1 1 0 0 1
Actividad colaborativa
i
g
0 0 0 0 0 1 1 0 0 0 1 0 1
M.C. Yalú Galicia Hdez. (FCC/BUAP)
Actividad colaborativa
Recorrido primero en anchura
+Grafo() +Grafo(n: int) +agregarVertice(v: String) +agregarArista(vo: String, vd: String) +verMatriz() +BFS(vi: String) //anchura M.C. Yalú Galicia Hdez. (FCC/BUAP) +DFS(vi: String) //profundidad
Vertice
-nombre: String -index: int -visitado: boolean +Vertice(nombre: string) +Vertice(nombre: string, index) +getIndex(nombre: string): int +setVisitado(s: boolean) +isVisitado(): boolean
Estructuras de Datos GRAFOS (parte 1)
45
–
2016
¿Que hemos aprendido?
M.C. Yalú Galicia Hdez. (FCC/BUAP)