Tema 14 Grafos y su Implementación en Java. Parte I. Objetivos. Bibliografía

Documentos relacionados
Tema 14 Grafos y su Implementación en Java. Parte II. Recorrido en Profundidad (DFS) de un Grafo. Recorrido de un Grafo: Ampliación de la clase Grafo

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

GRAFOS. Prof. Ing. M.Sc. Fulbia Torres

Es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre

Soluciones Ejercicios Tema 3

Clase adicional 2. Estructuras básicas de control. Temas

El TAD Grafo. El TAD Grafo

Tema: Los Grafos y su importancia para la optimización de redes.

Ruta más Corta con una sóla Fuente de Inicio (Single-Source Shortest Paths) DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

1. Conceptos básicos sobre el problema en cuestión y cuestiones afines. 2. Formulación de los correspondientes algoritmos y su pseudocódigo.

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

TEORÍA DE GRAFOS Ingeniería de Sistemas

Definición de Memoria

Tema Evaluación / Pruebas del Software

Capítulo 6. Relaciones. Continuar

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Representación de números enteros: el convenio exceso Z

Tema 2. El lenguaje de programación Java (Parte 1)

Un grafo G = (V, E) se dice finito si V es un conjunto finito.

Metodología y Tecnología de la Programación

4. Operadores Operador asignación

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Tema 2 Introducción a la Programación en C.

Introducción a Java LSUB. 30 de enero de 2013 GSYC

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Tema Árboles generales. 9.2 Árboles binarios 9.3 Árboles de búsqueda

Planificaciones Algoritmos y Programación II. Docente responsable: CALVO PATRICIA MABEL. 1 de 6

Clases en Java. Declaración de clases en Java 02/09/16. Ing. Roberto Martínez Román - public class Alumno { private int matricula;

Desarrollo de aplicaciones con JAVA, JCreator, JDeveloper NetBeans

Universidad Carlos III de Madrid Ingeniería de Telecomunicación. Examen de Programación Febrero Parte de Ejercicios

Java para programadores

11. Algunas clases estándar de Java (II)

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Clases Abstractas e Interfaces

PROYECTO FIGURAS DIAGRAMA DE FLUJO

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

2. Estructura de un programa en Java

Elementos léxicos del lenguaje de programación Java

Programación Orientada a Objetos. Java: Excepciones

Tema 3: Genericidad en Java. Tema 3: Genericidad en Java. Objetivos y Bibliografía. Modelos de Datos Genéricos

Caminos y Flujos optimales. Introducción a la Investigación de Operaciones 2007

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Ficha de Aprendizaje N 13

Introducción a la Programación Orientada a Objetos

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Instrucciones de control

Tema 4. Excepciones en Java

Fundamentos de JAVA. Angel Kuri Enero, /2/2006

Tema 10- Representación Jerárquica: Tema 10- Representación Jerárquica: Árboles Binarios

EXAMEN PARCIAL 23 de Octubre de 2015 Programación I. Grado en Matemáticas e Informática ETSIINF UPM

FACULTAD DE INGENIERÍA

Programación Orientada a Objetos. Java: Excepciones

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Caso práctico Alquiler de películas en un vídeo-club

Algoritmos sobre Grafos

Java Básico. Métodos estáticos

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

Ejercicios del tema 7: Clases y objetos

Metodología y Tecnología de la Programación

Estatutos de Control C# Estatutos de Decisión (Selección)

Primer Parcial de Programación 3 (1/10/2009)

Monitores Ing. Iván Medrano Valencia

Tema 7: Polimorfismo. Índice

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Tema 2: Clase y objetos en Java. Programación Orientada a Objetos Curso 2009/2010 Begoña Moros Valle

Ejercicios de evaluación de fundamentos de programación en Java

Fundamentos de Programación Visual Basic

Conversión entre Tipos

Examen de Programación II (Ingeniería Informática)

Trabajo Práctico N 4: Diseño por Contratos

Examen Parcial de Programación II Ejercicio Práctico

Principios de Computadoras II

Colecciones. Nadjet Bouayad-Agha Programación 2007

Inteligencia Artificial, Práctica 1. Felix Marquardt & Daniel Clemente 08 nov 05 19:54 Trabajo.java

En este capitulo se estudiarán los conceptos relacionados a métodos, como lo son sobrecarga, métodos estáticos.

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

Normalmente, los programas son ejecutados de forma secuencial. Único flujo de control

Introducción a la Programación en Java

Modulo 1 El lenguaje Java

Multitarea en Java. Rafa Caballero - UCM

Prácticas: Introducción a la programación en Java. Informática (1º Ingeniería Civil) Curso 2011/2012

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

public class AtaqueVoraz extends EsquemaVZ implements EstrategiaSolucion {

Vectores y matrices. Arrays Declaración Creación Acceso a los elementos de un array Manipulación de vectores y matrices

Práctica 3 mtp. metodoloxía e tecnoloxía da programación. Presentar detalles básicos sobre la sintaxis del lenguaje de programación Java.

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

Guía - Taller # 2 (JAVA)

Introducción al tipo Vector Cómo guardar una colección de datos conceptualmente relacionados? - almacenar los 100 primeros números primos, - al

Relaciones. Estructuras Discretas. Relaciones. Relaciones en un Conjunto. Propiedades de Relaciones en A Reflexividad

Universidad Nacional del Santa F A C U L T A D D E I N G E N I E R I A E.A.P. Ingeniería de Sistemas e Informática NETBEANS 7.0


Modulo 11. Clases y Objetos en Java

UNIVERSIDAD AUTÓNOMA DE YUCATÁN FACULTAD DE MATEMÁTICAS

Sockets. Los sockets son un mecanismo de comunicación entre procesos que se utiliza en Internet.

Transcripción:

Tema Grafos y su Implementación en Java Tema Grafos y su Implementación en Java Parte I Germán Moltó Escuela Técnica Superior de Ingeniería Informática Universidad Politécnica de Valencia Índice general:. Conceptos básicos sobre Grafos. Representación de un Grafo: Matriz vs Listas de Adyacencia. Representación de un Grafo Ponderado: la clase Adyacente. Representación de un Grafo ponderado y etiquetado: La clase GrafoDEtiquetado.. Recorrido en Profundidad (DFS) de un Grafo. Recorrido en Amplitud (BFS) de un Grafo Objetivos Bibliografía 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. Reutilizar las Estructuras de Datos empleadas en temas anteriores (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). 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). Libro de M.A. Weiss, Estructuras de Datos en Java (Adisson- Wesley, 000). Capítulo, para conceptos sobre Grafos y Grafos Dirigidos Capítulo, apartado.. 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, 988. Capítulo para conceptos sobre Grafos y Grafos Dirigidos

Motivación En ocasiones, los elementos de una colección tienen una relación entre ellos que debe ser capturada mediante la Estructura de Datos empleada. Ejemplos posibles: Elementos: Ciudades, Aeropuertos, Computadores de una Red, Puntos de un Plano, etc. Se pretende modelar: Rutas entre ciudades, rutas aéreas, recorridos turísticos, tareas a realizar en un proyecto, etc. 0 Grafo Dirigido 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) V = {,,,,, V = E = { (,), E = 8 (,), (,),(,), (,),(,), (,), (,) Grafo No Dirigido 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) V = {,,,,, E = {(,), (,), (,), (,) V = E = Grafo Etiquetado y Grafo Ponderado 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. Un Grafo Ponderado es un Grafo Etiquetado (sus Aristas) con números Reales. También es posible definir la función de etiquetado para los Vértices, con lo que podemos asignar un nombre a cada Vértice. 8

Relaciones de Incidencia Sea G = (V,E) un Grafo Dirigido. Si (u,v) Є E, decimos que Incide Desde u (sale de..) e Incide En v (llega a..) (, ) Є E, incide desde e incide en (, ) Є E, incide desde e incide en (, ) Є E, incide desde e incide en (, ) Є E, incide desde e incide en Sea G = (V,E) un Grafo no Dirigido. Si (u,v) Є E, decimos que Incide Sobre u y v (,) Є E, ó (,) incide sobre y, ó y (,) Є E, ó (,) incide sobre y, ó y Relaciones de Adyacencia Sea G = (V,E) un Grafo. Si (u,v) Є E, decimos que el Vértice v es Adyacente alvértice u Ejemplo con el Vértice es Adyacente a no es Adyacente a En un Grafo no Dirigido la relación es simétrica: Ejemplo con el Vértice es Adyacente a es Adyacente a 9 0 Grado de un Vértice El Grado de un Vértice en un Grafo no Dirigido es el número de Aristas que Inciden sobre él (Vértices Adyacentes). El Grado de es 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) Ejemplos: El Grado del Vertice es Grado de Entrada de es Grado de Salida de es El Grado de un Grafo es el de su Vértice de máximo Grado. Caminos sobre Grafos Un Camino de longitud k desde u a u en un grafo G=(V,E) es una secuencia de Vértices <v 0,v,..,v k > tal que: v 0 = u y v k = u i :..k : (v i -,v i ) Є E La Longitud k del Camino sin pesos es el número de Aristas con pesos es la suma de los Pesos de las Aristas del Camino Si hay un Camino P desde u hasta u, decimos que u es alcanzable desde u vía P Ejemplos: es alcanzable desde vía <,,> es alcanzable desde vía <,,,,>

Caminos Simples y Ciclos Un Camino es Simple si todos sus Vértices intermedios son distintos. Si los extremos son iguales es un Ciclo. Un Bucle es un ciclo de longitud En un Grafo Dirigido un Camino <v 0,v,..,v k > forma un Ciclo si: v 0 = v k el Camino contiene al menos una Arista Un Grafo Dirigido es Acíclico si no contiene Ciclos (GDA) Un Ciclo en este Grafo es <,,,, >, de longitud. El camino <,> es un bucle. Conceptos similares para los Grafos No Dirigidos. Representación de un Grafo: Matriz de Adyacencia Un Grafo G=(V,E) se puede representar con una Matriz de V x V boolean. Si (u,v) Є E, G[u][v] = true; sino G[u][v] = false. Memoria: O( V ) 0 Tiempo de acceso: O() 0 Esta representación consume bastante memoria. Útil para Grafos Densos (con muchas aristas). 0 false true false false false false false true false true true false false false false false false false true false false false true false false false false true false false false false true false false false Cuestiones Rápidas: Representación con Matriz de Adyacencia. Cómo saber si el grafo tiene bucles?. Cómo saber el número de vértices?. Cómo saber si hay algún vértice sin adyacentes?. Cómo calcular el número de adyacentes de un vértice?. Cómo sería la matriz de adyacencia de un grafo no dirigido?. Cómo representar un Grafo con aristas ponderadas usando una matriz de adyacencias? Representación de un Grafo: Listas de Adyacencia Un Grafo Dirigido G=(V,E) se suele representar con un array de V Listas de Vértices: G[v] es una Lista de los Vértices Adyacentes a v (v Є V). Memoria: O( V + E ) Tiempo de acceso: O(Grado de salida de G) X X X X X X

Representación de un Grafo: Listas de Adyacencia Un Grafo No Dirigido G=(V,E) se representa con un array de V Listas de Vértices: G[v] es una Lista de los Vértices Adyacentes a v (v Є V) Memoria: O( V +* E ) Tiempo de acceso: O(Grado de G) X X X X X Propuesta de Implementación de Grafos Grafo <<abstract>> GrafoD GrafoND GrafoDEtiquetado Grafo: Contiene los métodos comunes a cualquier implementación de un Grafo. GrafoD: Grafo dirigido con aristas ponderadas. GrafoND: Grafo no dirigido con aristas ponderadas GrafoDEtiquetado: Grafo dirigido con aristas ponderadas y vértices etiquetados. 8 La clase Java Grafo (I) Sobre la clase Grafo: public abstract class Grafo { public Grafo() {... public abstract int numvertices(); public abstract int numaristas(); public abstract boolean existearista(int i, int j); public abstract double pesoarista(int i, int j); 9 Su implementación irá creciendo conforme veamos métodos de recorrido, cálculo de caminos mínimos, etc. La clase Java Grafo (II) public abstract void insertararista(int i, int j); public abstract void insertararista(int i, int j, double p); public abstract ListaConPI<Adyacente> adyacentesde(int i); public String tostring(){ String res = "" ; for (int i = ; i <= numvertices() ; i++) { res += "Vértice: " + i; ListaConPI<Adyacente> l = adyacentesde(i); res += (l.esvacia())? " sin Adyacentes " : " con Adyacentes: "; for (l.inicio();!l.esfin() ; l.siguiente()) res += l.recuperar() + " "; 0 res += "\n"; return res; Implementa el método tostring. Salida: Vértice con adyacentes Vértice sin adyacentes

La clase Java Adyacente class Adyacente{ int destino; double peso; Adyacente(int codady, double p){ destino=codady; peso = p; public String tostring(){ return destino + ( + peso + ) ; La clase Adyacente no se hace pública puesto que únicamente se utilizará dentro del paquete grafos (acceso friendly únicamente para el resto de clases del paquete). Implementación de un Grafo Dirigido Ponderado: La Clase GrafoD GrafoD representa un Grafo de Vértices sin Etiquetar de Aristas con Pesos, Tripletes de int (origen, destino, coste) Mediante Listas de Adyacencia (array de V ListaConPI de Adyacentes) 8 X (,) X (,) (,8) (,) (,) X (,) X (,) X (,) X La clase Java GrafoD (I) import librerias.estructurasdedatos.modelos.listaconpi; import librerias.estructurasdedatos.lineales.leglistaconpi; public class GrafoD extends Grafo { protected int numv, numa; protected ListaConPI<Adyacente> elarray[]; @SuppressWarnings("unchecked") public GrafoD(int numvertices){ numv = numvertices; numa=0; elarray = new ListaConPI[numVertices+]; for (int i=; i<=numv; i++)elarray[i]= newleglistaconpi<adyacente>(); Por convenio, los vértices se numeran desde..n y se almacenan en las posiciones..n del array. La clase Java GrafoD (II) public int numvertices() { return numv; public int numaristas() { return numa; public boolean existearista(int i, int j) { ListaConPI<Adyacente> l = elarray[i]; boolean esta=false; for (l.inicio();!l.esfin()&&!esta; l.siguiente()) if (l.recuperar().destino==j) esta =true; return esta; public double pesoarista(int i, int j) { ListaConPI<Adyacente> l = elarray[i]; for (l.inicio();!l.esfin(); l.siguiente()) if (l.recuperar().destino==j) return l.recuperar().peso; return 0.0;

La clase Java GrafoD (III) public void insertararista(int i, int j) { insertararista(i,j,); public void insertararista(int i, int j, double p) { if (!existearista(i,j) ) { elarray[i].insertar(new Adyacente(j,p)); numa++; public ListaConPI<Adyacente> adyacentesde(int i) {return elarray[i]; /* Fin de la clase GrafoD */ Prueba de la clase GrafoD public static void main(string args[]){ GrafoD g = new GrafoD(); g.insertararista(,, ); g.insertararista(,, 8); 9 8 g.insertararista(,, 9); g.insertararista(,, ); System.out.println( El grafo es: "+g.tostring()); System.out.println("existeArista(,) = " + g.existearista(,)); ListaConPI<Adyacente> l = g.adyacentesde(); System.out.println( Los adyacentes al vértice son: "); for (l.inicio();!l.esfin(); l.siguiente()) { System.out.println( (, " + l.recuperar().destino + ")"); La clase Java GrafoND import librerias.estructurasdedatos.modelos.listaconpi; public class GrafoND extends GrafoD { public GrafoND(int numvertices) { super(numvertices); public void insertararista(int i, int j, int p) { if (!existearista(i,j) && i!= j) { elarray[i].insertar(new Adyacente(j,p)); elarray[j].insertar(new Adyacente(i,p)); numa++; /* Fin de la clase GrafoND */ Cómo se implementaría el método insertararista? No se permiten bucles. Implementación de Grafo Dirigido Ponderado con Vértices Etiquetados: Clase GrafoDEtiquetado La clase GrafoDEtiquetado representa un Grafo de Vértices con Etiquetas (dato de tipo objeto), i.e. Pares (etiqueta/dato, nº vértice) de Aristas con Pesos Mediante Listas de Adyacencia (array de V ListaConPI de Adyacentes) v 8 v 8 v v v v (v) (v) (v) x (v) (v) (v) (,) X (,) (,8) (,) (,) X (,) X (,) X (,) X

Correspondencia entre Etiquetas de Vértice y su Código El constructor del Grafo especifica los vértices de los que va a constar el grafo. Los vértices ya existen al crear el Grafo (aunque sin etiquetar). Para etiquetar un vértice, se utiliza el método: public void etiquetarvertice(int codigo, E etiqueta) Para obtener el código de un vértice a partir de su etiqueta, utilizamos un Diccionario<E,Integer>. D C 0 A B D B A D 8 E D 9 Índice Nombre D C A B E Listas de Adyacencia de cada Vértice La clase Java GrafoDEtiquetado (I) import librerias.estructurasdedatos.modelos.*; import librerias.estructurasdedatos.hash.tablahashdiccionario; import librerias.excepciones.elementonoencontrado; import java.util.arraylist; public class GrafoDEtiquetado<E> extends GrafoD{ E etiquetas[]; Diccionario<E, Integer> dicvertices; @SuppressWarnings("unchecked") public GrafoDEtiquetado(int numvertices) { super(numvertices); etiquetas = (E[]) new Object[numVertices+]; dicvertices = new TablaHashDiccionario<E, Integer>(numVertices); 0 La clase Java GrafoDEtiquetado (II) public boolean existearista(e i, E j) { return existearista(obtenercodigo(i), obtenercodigo(j)); public double pesoarista(e i, E j) { return pesoarista(obtenercodigo(i), obtenercodigo(j)); public void insertararista(e i, E j) { insertararista(obtenercodigo(i), obtenercodigo(j)); public void insertararista(e i, E j, double p) { insertararista(obtenercodigo(i), obtenercodigo(j), p); public ListaConPI<Adyacente> adyacentesde(e i) { return adyacentesde(obtenercodigo(i)); La clase Java GrafoDEtiquetado (III) public void etiquetarvertice(int codigo, E etiqueta) { etiquetas[codigo] = etiqueta; dicvertices.insertar(etiqueta, codigo); public E obteneretiqueta(int codigo) { return etiquetas[codigo]; public int obtenercodigo(e etiqueta) { int codigo; try { codigo = dicvertices.recuperar(etiqueta).intvalue(); catch (ElementoNoEncontrado e) { codigo = -; return codigo;

Prueba de la clase GrafoDEtiquetado public static void main(string args[]){ GrafoDEtiquetado<Persona> g = new GrafoDEtiquetado<Persona>(); Persona jane = new Persona("F","Jane Doe",); Persona john = new Persona("M","John Doe",); Persona paul = new Persona("8G", "Paul Carlson", ); Paul () g.etiquetarvertice(,jane); John g.etiquetarvertice(,john); () g.etiquetarvertice(,paul); Jane 0 g.insertararista(jane, john, 0); () g.insertararista(jane, paul, ); g.insertararista(paul, jane, ); Grafo de afinidad ([0..0]) que siente System.out.println("Grafo: " + g); una persona hacia las de su red social.