tema 10- grafosusers.dsic.upv.es/~nprieto/clases/eda0506/t10/traspas10_1.pdf · adyacencia 4....
TRANSCRIPT
1
1
Tema 10- GrafosDuración: 2 semanas aprox.Índice general:
1. Relaciones entre los Datos de una Colección 2. Conceptos básicos sobre Grafos3. Representación de un Grafo: Matriz y Listas de
Adyacencia4. Implementación de un Grafo en Java: las clases
Arista, Vertice y Grafo5. Recorrido de un Grafo: ampliación de la clase Grafo6. Caminos Mínimos en un Grafo sin y con Pesos (Dijkstra):
la clase Java CaminosDelGrafo
Objetivos:
Estudio de la Representación de una Relación Binaria entre los Datos de una Colección mediante la estructura Grafo y algunas de sus aplicaciones más significativas. Ello permitirá recapitular y ampliar conceptos y estructuras que se han estudiado a lo largo del curso, como:
la ventaja de re-utilizar el Software que presenta la POO, al estudiar las posibles Representaciones de un Grafo (Modelos Diccionario y Lista Con Punto de Interés ) y la implementación de las operaciones de Recorrido y cálculo de caminos mínimos sobre él (Modelos Cola y Cola de Prioridad)
las características de las Representaciones Lineal, Jerárquica y No Lineal de los Datos de una Colección para, respectivamente, su Acceso Secuencial, su Recorrido en Profundidad y Anchura y la Búsqueda Dinámica
Implementación en Java de un Grafo, que supondrá el diseño de las clases Arista, Vertice, Grafo y CaminosDelGrafo (ubicadas en el paquete grafos de estructurasDeDatos)
2
3
Bibliografía básica:
Weiss, M.A. Estructuras de datos en Java. Adisson-Wesley, 2000.
• Capítulo 14, para conceptos sobre Grafos y Grafos Dirigidos
• Capítulo 22, apartado 22.2.3 para el algoritmo de Dijkstra con Montículos de Emparejamiento
Aho A.V., Hopcroft J.E., Ullman J.E. Estructuras de datos y Algoritmos. Addison-Wesley, 1988. Capítulo 6 para conceptos sobre Grafos y Grafos Dirigidos
4
Sea un Colección cuyos Datos son:• ciudades• aeropuertos• computadores de una red• puntos del plano de una ciudad
Queremos modelar• rutas entre ciudades• rutas aéreas• envío de correo electrónico• recorridos turísticos
• carreteras• vuelos• enlaces• calles
Relaciones entre los Datos de la Colección
1) Representación Lineal2) Representación Jerárquica
35
10
3
5
Una Relación R sobre un Conjunto S se define como un Conjunto de Pares (a, b): a, b ∈ S
si (a, b) ∈ R se escribe a R b y denota que a está Relacionadocon b
indica si cada Par de Datos del Conjunto están o no Relacionados
Relación Binaria entre los Datos de la Colección
3) Grafo cuyos Vérticesse Relacionan vía Aristas
35
10
Relaciones entre los Datos de la Colección
6
Grafos Dirigidos y no DirigidosGrafos EtiquetadosRelaciones de Incidencia y AdyacenciaCaminos
Conceptos básicos sobre Grafos
4
7
Conceptos básicos sobre Grafos: Grafos Dirigidos (Digrafos)
Un Grafo Dirigido (gd) es un Par G = (V,E)
V es un conjunto finito de Vértices (o Nodos o Puntos)
E es un conjunto de Aristas (o Arcos) dirigidas
Arista: Par ordenado de Vértices (u,v): u → v
1 2 3
5 64
8
Conceptos básicos sobre Grafos: Grafos no Dirigidos (Grafos)
Un Grafo no Dirigido (gnd) es un Par G = (V,E)
V es un conjunto finito de Vértices
E es un conjunto de Aristas no Dirigidas
Arista: Par no ordenado de Vértices (u,v) = (v,u), u≠v : u v
1 2 3
5 64
5
9
Conceptos básicos sobre Grafos: Grafos Etiquetados
Un Grafo Etiquetado es un grafo G = (V,E) sobre el que se define una función f: E → A, dónde A es un conjunto cuyas componentes se llaman Etiquetas
NOTA: la función de etiquetado se puede definir también sobre V, el conjunto de Vértices
Un Grafo Ponderado es un Grafo Etiquetado (sus Aristas) con números Reales (A ≡ ℜ )
Ejemplos: discútase la necesidad de etiquetar/ponderar los Grafos asociados a las aplicaciones reseñadas en el primer punto del tema
10
Conceptos básicos sobre Grafos: Relaciones de Incidencia
Sea G = (V,E) un Grafo Dirigido. Si (u,v) ∈ E, decimos que Incidedesde u (sale de ..) e Incide en v (llega a ..)
1 2 3
5 64
Sea G = (V,E) un Grafo no Dirigido. Si (u,v) ∈ E, decimos que Incide sobre u y v
1 2 3
5 64
6
11
1 2 3
5 64
Sea G = (V,E) un Grafo. Si (u,v) ∈ E, decimos que el Vértice v es Adyacente al Vértice u
En un Grafo no Dirigido la relación es simétrica
1 2 3
5 64
Conceptos básicos sobre Grafos: Relaciones de Adyacencia
12
Conceptos básicos sobre Grafos: Grado de un Vértice
1 2 3
5 64
El Grado de un Vértice en un Grafo no Dirigido es el número de Aristas que Inciden sobre él
El Grado de un Vértice en un Grafo Dirigido es la suma de:• el número de Aristas que salen de él (Grado de Salida)• el número de Aristas que entran en él (Grado de Entrada)
1 2 3
5 64
( Vértices Adyacentes )
7
13
1 2 3
5 64
El Grado de un Grafo es el de su Vértice de máximo Grado
Conceptos básicos sobre Grafos: Grado de un Grafo
14
Conceptos básicos sobre Grafos: Caminos
Un Camino de longitud k desde u a u’ en un grafo G=(V,E) es una secuencia de Vértices ⟨ v0,v1,..,vk ⟩ tal que:• vo = u y vk = u’• ∀ i : 1..k : (vi-1,vi) ∈ E• la longitud k del Camino es el número de Aristas• la longitud del Camino con Pesos es la suma de los Pesos de
las Aristas que forman el CaminoSi hay un Camino P desde u hasta u’, decimos que u’ es alcanzable desde u vía P
1 2 3
5 64
8
15
Conceptos básicos sobre Grafos: Caminos Simples y Ciclos
Un Camino es Simple si todos sus Vértices son distintos
En un Grafo Dirigido un Camino ⟨ v0,v1,..,vk ⟩ forma un Ciclo si:
• vo = vk
• el Camino contiene al menos una Arista
El Ciclo es Simple si todos sus Vértices son distintos
Un Bucle es un Camino de longitud 1
Un Grafo Dirigido es Acíclico si no contiene Ciclos (GDA)
1 2 3
5 64
16
En un Grafo no Dirigido un Camino ⟨ v0,v1,..,vk ⟩ forma un Ciclo si:
• vo = vk
• si todos los vi son distintos
Un Grafo no Dirigido es Acíclico si no contiene Ciclos
1 2 3
5 64
Conceptos básicos sobre Grafos: Caminos Simples y Ciclos
9
Ejemplo: sea G = (V,E) un Grafo Dirigido con PesosV={v0,v1, v2, v3, v4, v5, v6 },
E={ (v0,v1, 2), (v0,v3, 1), (v1,v3, 3), (v1,v4, 10),
(v3,v4, 2), (v3,v6, 4), (v3,v5, 8), (v3,v2, 2),
(v2,v0, 4), (v2,v5, 5), (v4,v6, 6), (v6,v5, 1) }
Se pide: 1.- |V| y |E|2.- Vértices adyacentes a cada vi
3.- Grado de cada vi y del Grafo 4.- Caminos desde v0 al resto de Vértices, su longitud con y sin Pesos 5.- Vértices alcanzables desde v0
6.- Caminos mínimos desde v0 al resto de Vértices7.- ¿Tiene ciclos?
18
0 1 2 3 4 5
0
1
2
3
4
5
Representación de un Grafo: Matriz de Adyacencia
0 1 2
4 53
falsefalsefalsefalsefalsefalse
falsetruefalsefalsefalse
falsefalsefalsefalsefalse
falsefalsefalsefalsefalse
truefalse false false false false
truetruefalse false false
true
Un Grafo G=(V,E) se representa con una Matriz de|V|x|V| boolean: si (u,v) ∈ E, G[u,v] = true; sino G[u,v] = false
true
true
true
true
Memoria: O(|V|2)
Tiempo de acceso: O(1)
10
19
0 1 2 3 4 5
0
1
2
3
4
5
truefalse false false false
true truefalse false false false
true
0 1 2
4 53
true
true
true
true
falseflasefalsefalsefalse
falsefalsefalsefalsefalsefalse
falsefalsefalsefalse
falsefalsefalsefalsefalse
Un Grafo G=(V,E) se representa con una Matriz de|V|x|V| boolean: si (u,v) ∈ E, G[u,v] = true, sino G[u,v] = false
Representación de un Grafo: Matriz de Adyacencia
20
0 1 2
4 53
Un Grafo G=(V,E) se representa con un array de|V| Listas de Vértices: G[v], v ∈ V, es una Lista de los Vértices Adyacentes a v
Memoria: O(|V|+|E|)
Tiempo de acceso: O(Grado de G)
X
1 |X
1 | 3 |
4 |X
4 |X
3 |X2 |X
0 |
0
1
2
3
4
5
Representaciones de un Grafo: Listas de Adyacencia
11
21
Ejemplo propuesto: representar los siguientes Grafos
22
0 1 2
4 53
GrafoV0 representa un Grafo• de Vértices sin Etiquetar, i.e. de tipo int• de Aristas sin Pesos, i.e. Pares de intmediante Listas de Adyacencia (array de|V| Listas de Vértices)
Implementación de un Grafo en Java: la clase GrafoV0
X
1 |X
1 | 3 |
4 |X
4 |X
3 |X2 |X
0 |
0
1
2
3
4
5
12
23
package grafos;
import modelos.*; import lineales.*;
public class GrafoV0 {/** Representa un Grafo Básico mediante Listas de Adyacencia
* i.e. como un array de|V| Listas Con PI de Integer */
protected ListaConPI elArray[];
public GrafoV0(int numVertices){...}
public void insertarArista(int origen, int destino){...}
public String toString(){...}
}
Implementación de un Grafo en Java: la clase GrafoV0
package grafos; import modelos.*; import lineales.*; public class GrafoV0 {
protected ListaConPI elArray[];public GrafoV0(int numVertices){
}public void insertarArista(int origen, int destino){
}public String toString() {
}
elArray = new ListaConPI[numVertices];for ( int i=0; i numVertices; i++ ) elArray[i] = new LEIListaConPI();
La clase GrafoV0
elArray[origen].inicio();elArray[origen].insertar(new Integer(destino));
String res = “”; for ( int i = 0; i < elArray.length; i++ )
if ( elArray[i].esVacia() ) res += “Vértice ”+i+“ sin Adyacentes”;else res += “Vértice ”+i+“ con Adyacentes”+elArray[i].toString();
return res;
13
Ejemplo propuesto: escríbase un programa cuya salida sea la que se muestra a continuación y dibújese el Grafo leído.
Indique el número de Vértices del Grafo: 6Grafo inicializado:Vértice 0 sin AdyacentesVértice 1 sin AdyacentesVértice 2 sin AdyacentesVértice 3 sin AdyacentesVértice 4 sin AdyacentesVértice 5 sin AdyacentesIntroduzca Arista (Par de Vértices separados por blancos):0 10 41 01 42 54 04 15 2Grafo construido:Vértice 0 con Adyacentes 4 1Vértice 1 con Adyacentes 4 0Vértice 2 con Adyacentes 5Vértice 3 sin AdyacentesVértice 4 con Adyacentes 1 0Vértice 5 con Adyacentes 2
0 1 2
4 53
26
0 1 2
4 53
GrafoV1 representa un Grafo• de Vértices sin Etiquetar, i.e. de tipo int• de Aristas con Pesos, Tripletes de int (origen, destino, coste)mediante Listas de Adyacencia (array de|V| Listas de Vértices)
777
3
3
3
8
2 (1,3) |X
(1,2) | (3,8) |
(4,7) |X
(4,7) |X
(3,3) |X(2,7) |X
(0,7) |
X
0
1
2
3
4
5
Implementación de un Grafo Ponderado en Java: la clase GrafoV1
14
27
La clase Java Arista
package grafos;class Arista {
int destino;int coste;Arista(int d, int c){ destino = d; coste = c;}public String toString(){ return destino + “(”+ coste+ “)”; }
}
28
package grafos;
import modelos.*; import lineales.*;
public class GrafoV1 {
protected ListaConPI elArray[];
public GrafoV1(int numVertices){...}
public void insertarArista(int origen, int destino, int coste){
}
public String toString(){...}
}
La clase GrafoV1
elArray[origen].inicio();elArray[origen].insertar(new Arista(destino, coste));
15
29
Grafo representa un Grafo• de Vértices con Etiquetas, i.e. Pares (etiqueta, nº vértice) • de Aristas con Pesos, i.e. Tripletes de intmediante Listas de Adyacencia ( array de |V| Vértices)
777
3
3
3
8
2
v2
v5
v0 v1
v3 v4
(v0, )
(v1, )
(v2,x)
(v3, )
(v4, )
(v5, )
(1,3) |X
(1,2) | (3,8) |
(4,7) |X
(4,7) |X
(3,3) |X(2,7) |X
(0,7) |
0
1
2
3
4
5
Implementación de un Grafo Ponderado con Vértices Etiquetados en Java:
la clase Grafo
La clase Java Verticepackage grafos; import modelos.*; import lineales.*;class Vertice {
String nombre; int codigo;ListaConPI listaAdy;Vertice(String n){ this(n, -1);}Vertice(String n, int c){
nombre = n; codigo = c;listaAdy = new LEIListaConPI();
}}
¿ Cómo obtener codigo de un Vértice a partir de su nombre ?
Al insertar un Vértice en un Grafo se actualiza un Diccionario deVértices con una nueva Entrada tal que su clave == nombre ysu codigo == ordenInsercionVertice
16
31
Ejemplo: inserción de una Arista, Par de Vértices, en Grafo
D C 10
Diccionario de Vértice’s
..........
D D, ¿? buscar(D)Vértice 0:
Grafo (vacío)|V| = 0
32
Ejemplo: inserción de una Arista, Par de Vértices, en Grafo
D C 10
Diccionario de Vértice’s
..........
D D,¿? buscar(D)
ElementoNoEncontrado0Vértice 0:
Grafo (vacío)|V| = 0
17
33
Ejemplo: inserción de una Arista, Par de Vértices, en Grafo
D C 10
Diccionario de Vértice’s
..........
D, 0
D, insertar((D, 0))0Vértice 1:
0D
Grafo |V| = 01
34
Ejemplo: inserción de una Arista, Par de Vértices, en Grafo
D C 10
Diccionario de Vértice’s
..........
C C, ¿? buscar(C)
ElementoNoEncontrado
1Vértice 2:
D, 0
0D
Grafo |V| = 1
18
35
Ejemplo: inserción de una Arista, Par de Vértices, en Grafo
D C 10
Diccionario de Vértice’s
..........
C, insertar((C, 1))1Vértice 2:
D, 0
0D
Grafo |V| = 1
C, 1
2
1C
10
10
36
Ejemplo: inserción de una Arista, Par de Vértices, en Grafo
D B 23
Diccionario de Vértice’s
..........
D, 0
0D
Grafo |V| = 2
C, 1
1C
10
D D, ¿? buscar(D)
ElementoDuplicado0Vértice 3:
19
37
package grafos;
import modelos.*; import excepciones.*;
import lineales.*; import noLineales.*;
public class Grafo {
protected Vertice elArray[];
public Grafo(int numVertices){...}
public void insertarArista(String nO, String nD, int coste){...}
public String toString(){...}
protected Diccionario dicVertices;protected int ordenInsercionVertice;
public int insertarVertice(String nO){...}
}
La clase Grafo
public Grafo(int numVertices){
}public String toString() {
}public void insertarArista(String nO, String nD, int coste){
}
La clase Grafo
20
39
public int insertarVertice(String nombreVertice) {int res = -1;Vertice v = new Vertice(nombreVertice); try { res = ((Vertice)dicVertices.buscar(v)).codigo; }catch(ElementoNoEncontrado e){
res = v.codigo = ordenInsercionVertice;try { dicVertices.insertar(v); }catch(ElementoDuplicado ed){;}elArray[res] = v;ordenInsercionVertice++;
}return res;
}
La clase Grafo
40
Ejemplo propuesto: definir el método toString en Grafo de forma que se muestren siempre los Vértices mediante sus etiquetas, y no con la representación numérica interna
21
41
Método constructor para crear un Grafo a partir de la información de Aristas/Vértices leída desde un ficheroMétodo para consultar el número total de Aristas de un GrafoMétodo para consultar el Grado de un Vértice dado de un Grafo (Grado de Salida si el Grafo es Dirigido)Método para consultar el Grado de un Grafo (Grado de Salida si el Grafo es Dirigido)Método para consultar si un Grafo está VacíoMétodo para consultar si una Arista dada pertenece a un Grafo
Ejemplo propuesto: definir los siguientes métodos de la clase Grafo
Ejemplos resueltos: los que aparecen en los exámenes disponibles en la MicroWeb de la asignatura