Tema: Recorrido en Profundidad para Grafos.
Transcripción
Tema: Recorrido en Profundidad para Grafos.
Programación IV. Guía 11 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Recorrido en Profundidad para Grafos. Objetivos Específicos • A partir de un ejemplo de grafos identificar el recorrido en profundidad y aplicaciones de grafos. • Implementar el recorrido en profundidad en grafos utilizando Visual C#.NET. Materiales y Equipo • Guía Número 11. • Computadora con programa Microsoft Visual C#. Introducción Teórica Recorrido en profundidad. Este método es una forma básica de recorrer un grafo implementando recursividad. En este recorrido se basan los recorridos preorden y postorden para arboles binarios. El recorrido en profundidad trabaja de la siguiente manera: 1. Se inicia visitando un nodo cualquiera. 2. Se recorre en profundidad los nodos conexos, hasta llegar a un nodo sin arco saliente, o se encuentra un nodo ya visitado. 3. Si después de haber visitado todos los nodos conexos al primero nodo visitado, aún quedan nodos sin visitar, se repite el proceso a partir de cualquiera de estos nodos no visitados, siguiendo sobre ellos los pasos 1 y 2. Los usos que pueden darse a este tipo de recorridos son: 2 Programación IV. Guía 11 Simular una red, a partir de un grafo y analizar su robustez para transferencia de información. Identificar bucles, los cuales son potenciales causantes de elevación de tráfico en recorridos. Hay que tomar en cuenta que, para recorridos primero en profundidad, no existe un único recorrido de grafo, sino un conjunto de ellos. Para el siguiente grafo, habría varios recorridos en profundidad posibles, entre los cuales podríamos mencionar: Visitando primero el nodo izquierdo seria: a→d→e→b→c Visitando primero el derecho seria: a→b→c→e→d Procedimiento Ejemplo 1. Para el código de grafo, visto en la práctica anterior, agregar los siguientes métodos a la clase grafo: // Eliminar Vértice public void SuprimirVertice(CVertice pVertice) { if (ExisteVertice(pVertice)) { EliminarDeLLegadas(pVertice); suprimirVertice(pVertice); } else Console.WriteLine("Error al querer eliminar. El vertice {0} no existe", pVertice); } private void EliminarDeLLegadas(CVertice pVertice) { if (aVertice != null) { aLista.Eliminar(pVertice); aSiguiente.EliminarDeLLegadas(pVertice); } } Programación IV. Guía 11 private void suprimirVertice(CVertice pVertice) { if (aVertice != null) { if (aVertice.Equals(pVertice)) { if (aSiguiente.aSiguiente != null) { aVertice.nombre = aSiguiente.aVertice.nombre; aLista = new CLista(aSiguiente.aLista); aSiguiente = aSiguiente.aSiguiente; } else { aVertice = null; aLista = null; aSiguiente = null; } } else aSiguiente.SuprimirVertice(pVertice); } } // Eliminar Arco public void SuprimirArco(CVertice pVerticeOrigen, CVertice pVerticeDestino) { // Posicionarse en el elemento donde se agregará el arco if (ExisteVertice(pVerticeOrigen) && ExisteVertice(pVerticeDestino)) { if (aVertice.nombre.CompareTo(pVerticeOrigen.nombre) == 0) { //Suprimir Arco if (aLista.ExisteElemento(pVerticeDestino)) aLista.Eliminar(pVerticeDestino); } else { if (aSiguiente != null) aSiguiente.SuprimirArco(pVerticeOrigen, pVerticeDestino); } } } // Recorrido en profundidad public void RecorridoEnProfundidad() { int NroVertices = NumerodeVertices( ); string[ ] ArreglosVisitados = new string[NroVertices]; for (int i = 0; i <= NroVertices - 1; i++) { ArreglosVisitados[i] = "F"; } for (int i = 0; i <= NroVertices - 1; i++) { if (ArreglosVisitados[i] == "F") RecorrerVerticeProfundidad(IesimoVertice(i + 1), ArreglosVisitados); } } 3 4 Programación IV. Guía 11 private void RecorrerVerticeProfundidad(CVertice pVertice, string[ ] ArreglosVisitados) { int Posicion = PosicionVertice(pVertice); ArreglosVisitados[Posicion - 1] = "T"; Console.Write(" " + pVertice.nombre + " , "); for (int i = 0; i <= GradoSaliente(pVertice) - 1; i++) { CVertice NuevoVertice = IesimoSucesor(pVertice, i + 1); int j = PosicionVertice(NuevoVertice); if (ArreglosVisitados[j - 1] == "F") RecorrerVerticeProfundidad(NuevoVertice, ArreglosVisitados); } } public CVertice IesimoVertice(int posicion) { if (posicion > 0) { if (posicion == 1) return aVertice; else return aSiguiente.IesimoVertice(posicion - 1); } else return null; } public int PosicionVertice(CVertice pVertice) { if ((aVertice == null) || (pVertice == null)) return 0; else if (!ExisteVertice(pVertice)) return 0; else if (aVertice.nombre.Equals(pVertice.nombre)) return 1; else return 1 + aSiguiente.PosicionVertice(pVertice); } public CVertice IesimoSucesor(CVertice pVertice, int posicion) { if (ExisteVertice(pVertice)) { if (aVertice.Equals(pVertice)) return ((posicion > 0) && (posicion <= aLista.NroElementos()) ? (aLista.IesimoElemento(posicion) as CVertice) : null); else return aSiguiente.IesimoSucesor(pVertice, posicion); } else return null; } Programación IV. Guía 11 public int GradoSaliente(CVertice pVertice) { if (!ExisteVertice(pVertice)) return 0; else { if (aVertice.Equals(pVertice)) return aLista.NroElementos(); else return aSiguiente.GradoSaliente(pVertice); } } Agregar las siguientes llamadas al menú de opciones en el archivo Program.cs: case "6": //Eliminar vértice Console.Write("Ingrese Vertice:====>> "); Ver.nombre = Console.ReadLine( ); Grafo.SuprimirVertice(Ver); Console.WriteLine("Vertice eliminado correctamente......"); break; case "7": // Suprimir Arco Console.Write(" Ingrese Vertice Origen:====>> "); Ver1.nombre = Console.ReadLine( ); Console.Write(" Ingrese Vertice Destino:====>> "); Ver2.nombre = Console.ReadLine( ); Grafo.SuprimirArco(Ver1, Ver2); break; case "8": //Recorrido en profundidad Console.WriteLine("Recorrido en profundidad"); Grafo.RecorridoEnProfundidad( ); Console.WriteLine( ); break; Análisis de resultados Ejercicio 1. Explique, que hacen los siguientes métodos: IesimoVertice PosicionVertice IesimoSucesor GradoSaliente 5 6 Programación IV. Guía 11 Ejercicio 2. Desarrollar el método BuscarVertice. • Parámetro: el vértice a buscar debe ser especificado por el usuario, • Retorno: booleano, devolver verdadero en caso de encontrar el vértice, falso en caso contrario. Investigación Complementaria Para la siguiente semana: En la implementación de grafo a partir de una estructura de matriz de adyacencia realizada en la tarea de la guía anterior, desarrollar: a) Una función para el recorrido primero en profundidad. b) El método para buscar vértices. La implementación de Grafos con matriz de adyacencia debe tener toda la funcionalidad (opciones de menú) que se le han proporcionado con la implementación con listas de adyacencia. Programación IV. Guía 11 Guía 11: Recorrido en Profundidad para Grafos. Hoja de cotejo: Alumno: Máquina No: Docente: GL: 7 11 Fecha: EVALUACIÓN % CONOCIMIENTO Del 20 al 30% APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% ACTITUD Del 15% al 30% TOTAL 100% 1-4 5-7 8-10 Conocimiento deficiente de los fundamentos teóricos Conocimiento y explicación incompleta de los fundamentos teóricos Conocimiento completo y explicación clara de los fundamentos teóricos No tiene actitud proactiva. Actitud propositiva y con propuestas no aplicables al contenido de la guía. Tiene actitud proactiva y sus propuestas son concretas. Nota