tema 10- grafosusers.dsic.upv.es/~nprieto/clases/eda0506/t10/traspas10_1.pdf · adyacencia 4....

21
1 1 Tema 10- Grafos Duración : 2 semanas aprox. Índice general : 1. Relaciones entre los Datos de una Colección 2. Conceptos básicos sobre Grafos 3. Representación de un Grafo: Matriz y Listas de Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido de un Grafo: ampliación de la clase Grafo 6. 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)

Upload: lethuy

Post on 07-Feb-2018

230 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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)

Page 2: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 3: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 4: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 5: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 6: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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 )

Page 7: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 8: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 9: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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)

Page 10: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 11: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 12: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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;

Page 13: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 14: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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));

Page 15: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 16: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 17: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 18: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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:

Page 19: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 20: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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

Page 21: Tema 10- Grafosusers.dsic.upv.es/~nprieto/clases/EDA0506/T10/Traspas10_1.pdf · Adyacencia 4. Implementación de un Grafo en Java: las clases Arista, Vertice y Grafo 5. Recorrido

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