Practico 4 ejercicio 2

Practico 4 ejercicio 2

de Luciano Umpierrez Garcia -
Número de respuestas: 5

Buenas, como están? Me ayudarían en saber si esta justificación sobre tiempo para este algoritmo del ejercicio 2 del practico 4 es correcta o tiene fallas? En caso de estar mal, que puntos debería mejorar?. Saludos. 




En respuesta a Luciano Umpierrez Garcia

Re: Practico 4 ejercicio 2

de Facundo Benavides -
hola luciano,
la justificación es correcta en gral sin embargo anoto algunos detalles "no menores" en la última parte (construcción del ciclo)
- no vi que justificaras el paso donde se crea S' (no es trivial).
- la elección de un nodo v no es trivial ya que las aristas incidentes a iter pueden llevarme fuera de S'. ergo, podría tener que probar varios vs por cada iter hasta elegir uno que sirva.
- para implementar el camino (que contendrá necesariamente un ciclo) alcanza con una lista simple o una pila. observar que como estas estructuras invierten el orden entonces el ciclo (que es lo último que proceso en el while) queda al comienzo. luego la impresión del mismo se hace a partir del primero de la pila/lista hasta encontrar iter.

salvo eso, estaría bien de bien.

luego, a modo de discutir alternativas. cuando creas la lista de adyacencias entrantes ya podrías calcular el grado cargando un arreglo indeg que utilizás en el primer for. también se podría definir un contador de nodos con grado in mayor a cero. este serviría para no tener que recorrer orden para chequear su largo. o análogamente, la lista orden podría tener un cabezal donde se almacene la cantidad de elementos. por último, para crear S' alcanzaría con recorrer indeg tomando los que sean mayores que 0.

saludos
En respuesta a Facundo Benavides

Re: Practico 4 ejercicio 2

de Amalia Lucia Balestrazzi Silveira -
Buenas,
Queria saber si mi pseudo algoritmo está bien.
Gracias

solucion(s)
  inicializar conjunto S vacio
  inicializar arreglo indeg de largo #V
  for each u in V
    indeg[u] <- #aristas entrantes de u
    if (indeg[u] = 0) agregar u a S
  Inicializar lista L vacia
  while (S no es vacio) {
    remover un nodo i de S y de V y agregarlo a L
    por cada nodo j con una arista i->j 
      indeg[j] --
      if (indeg[j] = 0) agregar j a S
  if (V es vacio)
    devolver el orden topologico L
  else //todos los nodos en V tienen aristas entrantes
    crearListaAdyacenciasEntrantes(V)
    Inicializar pila P vacia
    Inicilizar arreglo de booleanos Visitado de largo #V en falso para todos
    tomar un nodo i cualquiera de V y agregarlo a P
    while (Visitado[i] es falso)
      Visitado[i] <- verdadero
      i <- primer nodo en la lista de adyacencias de aristas entrantes de i
      agregar i a P
    inicializar lista C vacia
    ultimo <- pop(P)
    agregar ultimo a C
    while (top(P) != ultimo)
      i <- pop(P)
      agregar i a C
    devolver C
      
crearListaAdyacenciasEntrantes(V)
  por cada nodo v in V
    por cada arista v->u
      agregar v a la lista de adyacencias entrantes de u
En respuesta a Amalia Lucia Balestrazzi Silveira

Re: Practico 4 ejercicio 2

de Facundo Benavides -
hola amalia,
viene muy bien rumbeado. un detalle que tal vez quedó medio oculto. es el peligro que corremos con los pseudocódigos =D
cuando decís de eliminar i de V en el primer while, tendría cuidado. esa operación sobre una implementación de grafo basada en lista de adyacencias (salientes) no sería aconsejable antes de realizar el for de la sentencia que sigue porque justamente necesitamos recorrer la lista de adyacentes del nodo i.
saludos
En respuesta a Facundo Benavides

Re: Practico 4 ejercicio 2

de Amalia Lucia Balestrazzi Silveira -
Gracias por la respuesta! En este caso, alcanzaría con dar vuelta el orden de esas dos sentencias no?
De otra manera podría no borrar los nodos de V, y cambiarían un par de cosas mas adelante: en lugar preguntar si V es vacío, preguntaría si #L es igual a #V, y en el else tendría que crear un conjunto auxiliar con los nodos que tienen indegree mayor a cero al terminar el primer while, lo que haría recorriendo el arreglo indeg.