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

Documentos relacionados