Documentos de Académico
Documentos de Profesional
Documentos de Cultura
EDA Tema 14 Parte I Gmolto PDF
EDA Tema 14 Parte I Gmolto PDF
Índice general:
1. Conceptos básicos sobre Grafos
Tema 14 – Grafos y su 2. Representación de un Grafo: Matriz vs Listas de Adyacencia
Implementación en Java 3. Representación de un Grafo Ponderado: la clase Adyacente
Parte I 4. Representación de un Grafo ponderado y etiquetado: La clase
GrafoDEtiquetado.
5. Recorrido en Profundidad (DFS) de un Grafo
Germán Moltó
6. Recorrido en Amplitud (BFS) de un Grafo
Escuela Técnica Superior de Ingeniería Informática
Universidad Politécnica de Valencia
1 2
Objetivos Bibliografía
Estudio de la Representación de una Relación Binaria Libro de M.A. Weiss, “Estructuras de Datos en Java” (Adisson-
entre los Datos de una Colección mediante la estructura Wesley, 2000).
Capítulo 14, para conceptos sobre Grafos y Grafos Dirigidos
Grafo y algunas de sus aplicaciones más significativas.
Capítulo 22, apartado 22.2.3 para el algoritmo de Dijkstra con
Reutilizar las Estructuras de Datos empleadas en temas Montículos de Emparejamiento
anteriores (Diccionario y Lista con Punto de Interés) y la
Aho A.V., Hopcroft J.E., Ullman J.E. Estructuras de datos y
implementación de las operaciones de Recorrido y Algoritmos. Addison-Wesley, 1988.
cálculo de caminos mínimos sobre él (Modelos Cola y Capítulo 6 para conceptos sobre Grafos y Grafos Dirigidos
Cola de Prioridad).
Implementación en Java de un Grafo, que supondrá el
diseño de las clases Adyacente, Vertice, GrafoD, GrafoND
y GrafoDEtiquetado (ubicadas en el paquete grafos de
estructurasDeDatos).
3 4
Motivación Grafo Dirigido
En ocasiones, los elementos de una colección tienen una Un Grafo Dirigido (GD) es un Par G = (V,E)
relación entre ellos que debe ser capturada mediante la V es un conjunto finito de Vértices (o Nodos o Puntos)
Estructura de Datos empleada. E es un conjunto de Aristas (o Arcos) dirigidas
35
Arista: Par ordenado de Vértices (u,v)
10 V = {1,2,3,4,5,6} |V| = 6
5 6
7 8
Relaciones de Incidencia Relaciones de Adyacencia
Sea G = (V,E) un Grafo Dirigido. Si (u,v) Є E, decimos Sea G = (V,E) un Grafo. Si (u,v) Є E, decimos que el
que Incide Desde u (sale de ..) e Incide En v (llega a ..) Vértice v es Adyacente al Vértice u
• (2, 2) Є E, incide desde 2 e incide en 2 • Ejemplo con el Vértice 2 1 2 3
1 2 3
• (1, 2) Є E, incide desde 1 e incide en 2 • 2 es Adyacente a 1
• (2, 4) Є E, incide desde 2 e incide en 4 • 1 no es Adyacente a 2 4 5 6
• (2, 5) Є E, incide desde 2 e incide en 5 4 5 6
• En un Grafo no Dirigido la relación es simétrica:
• Sea G = (V,E) un Grafo no Dirigido. Si (u,v) Є E, decimos que
Incide Sobre u y v
1 2 3 • Ejemplo con el Vértice 3
1 2 3
• (1,2) Є E, ó (2,1) incide sobre 1 y 2, ó 2 y 1 • 3 es Adyacente a 6
• (2,5) Є E, ó (5,2) incide sobre 2 y 5, ó 5 y 2 4 5 6 • 6 es Adyacente a 3
4 5 6
9 10
Un Camino es Simple si todos sus Vértices intermedios Un Grafo G=(V,E) se puede representar con una Matriz
son distintos. Si los extremos son iguales es un Ciclo. de |V|x|V| boolean. Si (u,v) Є E, G[u][v] = true; sino
Un Bucle es un ciclo de longitud 1 G[u][v] = false. 0 1 2 3 4 5
En un Grafo Dirigido un Camino <v0,v1,..,vk> forma un Memoria: O(|V|2) 0 false true false false false false
Ciclo si: Tiempo de acceso: O(1) 1 false true false true true false
v 0 = vk
el Camino contiene al menos una Arista 2 false false false false false false
0 1 2
Un Grafo Dirigido es Acíclico si no contiene Ciclos 3 true false false false true false
(GDA) 4 false false false true false false
Un Ciclo en este Grafo es <1, 2, 5, 4, 1>, 1 2 3 3 4 5
5 false false true false false false
de longitud 4.
El camino <2,2> es un bucle. 4 5 6 Esta representación consume bastante memoria.
Conceptos similares para los Grafos No Dirigidos. Útil para Grafos Densos (con muchas aristas).
13 14
15 16
Representación de un Grafo: Listas de
Adyacencia Propuesta de Implementación de Grafos
Un Grafo No Dirigido G=(V,E) se representa con un Grafo: Contiene los métodos
Grafo comunes a cualquier
array de |V| Listas de Vértices: G[v] es una Lista de los <<abstract>>
Vértices Adyacentes a v (v Є V) implementación de un Grafo.
Memoria: O(|V|+2*|E|) GrafoD: Grafo dirigido con
Tiempo de acceso: O(Grado de G) aristas ponderadas.
GrafoD
1 2| 5 |X GrafoND: Grafo no dirigido
1 2 con aristas ponderadas
1 3 2 1| 5| 4| 3 |X
3
GrafoDEtiquetado: Grafo
5 4 2| 4 |X GrafoDEtiquetado
dirigido con aristas
4 5| 2| 3 |X
ponderadas y vértices
5 1| 2| 4 |X GrafoND etiquetados.
17 18
19 20
Implementación de un Grafo Dirigido
La clase Java Adyacente Ponderado: La Clase GrafoD
package librerias.estructurasDeDatos.grafos; GrafoD representa un Grafo
class Adyacente{ de Vértices sin Etiquetar
int destino; de Aristas con Pesos, Tripletes de int (origen, destino, coste)
double peso;
Mediante Listas de Adyacencia (array de |V| ListaConPI
Adyacente(int codAdy, double p){ destino=codAdy; peso = p; }
de Adyacentes)
public String toString(){ return destino + “(”+ peso + “)”; } 2 1 (2,3) |X
} 2 (2,2) | (4,8) | (5,7) |X
3
1 2 3
8 3 X
La clase Adyacente no se hace pública puesto que únicamente se 7 7 7
utilizará dentro del paquete grafos (acceso friendly únicamente 3 4 (1,7) |
4 5 6 (5,3) |X
para el resto de clases del paquete). 3 5 (4,3) |X
6 (3,7) |X
21 22
25 26