Universidad Simón Bolı́var Departamento de Computación y Tecnologı́a de la Información CI-2693 Laboratorio de Algoritmos III - Sección 2 Trimestre Septiembre-Diciembre de 2008 Tarea 3: Recorrido de Grafos 1. Introducción El objetivo de la tarea es el de trabajar con la técnica de recorrido de grafos, llamada Búsqueda en Amplitud (Breadth-First Search). Se le proporcionará en la página web del curso de un código base el cual usted puede decidir usar o no. En el código base el archivo BFSSearch.java es el cliente de la aplicación. Se requiere que su aplicación sea capaz de llevar a cabo 2 actividades. Se recomienda la lectura del capı́tulo 18 Graph Search, especı́ficamente desde la sección 18,1 hasta la 18,4 del libro Algorithms in Java [2]. Asimismo se tiene que el libro Grafos y Algoritmos [1], en el Capı́tulo IV Recorrido en grafos también puede servir como referencia. 2. Actividad 1: Búsqueda en Amplitud Se debe recorrer un grafo usando el algoritmo de Búsqueda en Amplitud. Para ello debe implementar en JAVA el siguiente operador: BFS : Grafo × id Vértice inicial × arreglo de enteros × arreglo de enteros → Nada Se tiene que la semántica del operador es la siguiente: BFS(G, id, orden[], pred[]) hace un recorrido usando la técnica Búsqueda en amplitud en el grafo G. El argumento id es un número entero que representa el identificador del vértice desde comienza el recorrido. Se quiere obtener de la Búsqueda en amplitud dos arreglos. El primero es orden[] que debe contener la posición u orden en que es visitado todos los vértice durante el recorrido. El segundo es pred[] que almacena los predecesores de cada uno de los vértices de la arborescencia que se obtiene del recorrido del grafo. Debido a que los resultados de la Búsqueda en amplitud dependen del orden en que se visitan los vértices, para obtener siempre un mismo resultado, sin importar el orden en que se cargen los datos, se tendrá que el grafo en su aplicación debe tener los vértices que componen cada una de las listas de adyacencias del grafo, ordenados de manera descendente. 3. Actividad 2: Búsqueda de caminos Se desea que modifique el algoritmo de Búsqueda en amplitud, para determinar un camino entre un par de vértices. La idea es que dado un vértice inicial y un vértice final, se comience una Búsqueda en amplitud desde el vértice inicial y una vez alcanzado el vértice final se detiene el algortimo para luego imprimir el camino obtenido. En caso de recorrer todos los vértices que son alcanzables desde el vértice inicial y no haber visitado al vértice final, entonces se declara que no hay un camino entre los pares de vértices. Para llevar a cabo esta actividad se debe implementar el siguiente operador: obtenerCaminoBFS : Grafo × id Vértice Inicial × id Vértice Final → Lista de Vértices Se tiene que obtenerCaminoBFS(G, idVi , idVf ), recibe un grafo G, un vértice inicial idVi de donde comienza el recorrido y el vértice final idVf , el cual es el vértice meta del camino a buscar. Se retorna una lista de vértices que componen el camino 4. Especificación de la Entrada/Salida 4.1. Entrada La sipnosis de la entrada del programa principal es: 1 >java BFSSearch <actividad> <vi> [<vf>] <archivo> Donde: actividad número de la actividad a resolver, 1 para la actividad 1 y 2 para al actividad 2 vi es el identificador del vértice de partida del recorrido vf es el identificador del vértice de meta del recorrido. Sólo válido para la actividad 2 archivo es el nombre del archivo donde se define el grafo con el formato con el formato utilizado en los laboratorios anteriores 4.2. Salida Para la actividad 1 se debe imprimir el orden en el que son visitados los vértices en la búsqueda y cual es el vértice predecesor de cada uno de los vértices durante el recorrido. La salida de la actividad 2 muestra el camino entre el vértice inicial y el final si este existe. De lo contrario indica que no hay camino. 4.3. Ejemplo Suponga que se tiene un archivo con la data de un grafo, llamado g.txt, con el siguiente contenido: n 13 13 0 1 0 6 0 2 0 5 5 4 5 3 3 4 4 6 7 8 9 12 9 10 9 11 11 12 4.3.1. Ejecución de la actividad 1 >java BFSSearch 1 0 g.txt 4.3.2. Salida de la actividad 1 Vertice - Orden --------------0 0 1 4 2 3 3 6 4 5 5 2 6 1 7 7 8 8 9 9 10 12 11 11 2 12 10 Vertice - Predecesor --------------------0 0 1 0 2 0 3 5 4 6 5 0 6 0 7 7 8 7 9 9 10 9 11 9 12 9 4.3.3. Ejecución de la actividad 2 >java BFSSearch 2 0 4 g.txt 4.3.4. Salida de la actividad 2 >Camino encontrado: 0 6 4 4.3.5. Otra ejecución de la actividad 2 >java BFSSearch 2 0 12 g.txt 4.3.6. Otra salida de la actividad 2 >No existe camino entre los vertices 0 12 5. Condiciones de la entrega Para el jueves de la semana 6, debe entregar en un CD-ROM, debidamente identificado con los fuentes de su solución. Ese mismo dı́a se le pedirá que modifique y/o agregue una funcionalidad al programa a entregar. La actividad en el laboratorio será evaluada. Referencias [1] M. Ortega and O. Meza. Grafos y Algoritmos. Equinoccio, 2006. [2] R. Sedgewick. Algorithms in Java. Addison-Wesley Professional, 2003. 3