• Domingo 22 de Diciembre de 2024, 21:31

Autor Tema:  Caminomaslargo De Un Digrafo  (Leído 1079 veces)

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Caminomaslargo De Un Digrafo
« en: Lunes 17 de Octubre de 2005, 22:36 »
0
Saludos, nuevamente me veo en problemas, pues las profesoras se la han rebuscado para inventar que: un digrafo se implemente con otro TDA en este caso MAPEO A MUCHOS!!!! y encima quieren que implementemos la operacion CaminoMasLargo( G:tdigrafo; v1,v2:trotulo; var c:tLista); donde c es una lista de rotulos (es decir es el camino mas largo)

Segun yo lo entiendo, el digrafo=MapeoMuchos seria una lista de registro cada nodo de esa lista tiene dos campos uno es el dominio (vertices) y el otro seria el rango (Lista de adyacencia de ese vertice).

Bueno.... el codigo es este y mi favor que me digan si andaria:

Código: Text
  1.  
  2.  
  3. {------------------------------------------------------------------------------------------------------}
  4. Procedure CaminoMasLargo(G:tdigrafo; v1,v2:trotulo; var c:tdaLista.Lista; var cod:integer);
  5. var
  6. cjto:tdaCjtoD.conjunto; L:tdaLista.lista;
  7. Begin
  8.   if not DigrafoVacio(G) then
  9.   Begin
  10.     tdaLista.VaciarLista(C);
  11.     Dominio(g, cjto); {procedimiento que transforma el dominio del mapeo en un conjunto}
  12.     if (tdaCjtoD.Pertenencia(v1, cjto)) and (tdaCjtoD.Pertenencia(v2, cjto)) then
  13.     Begin
  14.       tdaLista.CrearLista(L); CaminoMasLargoAux(g, v1, v2, c, L);
  15.       tdaLista.Insertar(c, tdaLista.longitud(C)+1, v2, cod);
  16.           {Lista, posicion en la lista, elemento, codigo de error}
  17.     end;
  18.   end else cod:=4
  19. end;
  20. {---------------------------------------------------------------------------------------------------}
  21. Procedure CaminoMasLargoAux(G:Tdigrafo; v1,v2:trotulo; var c,L:tdaLista.lista);
  22. var
  23. Lrang:tdaLista.Lista; I,cod,pos:integer;
  24. Begin
  25.   tdaLista.Insertar(L, tdaLista.longitud(L)+1, v1, cod);
  26.   Valor(G, v1, Lrang, cod); {procedimiento del TDAMapeoAMucho que dado un dominio (=trotulo) te devuelve el rango en este caso Lrang}
  27.   I:=1;
  28.   
  29.   While (I<=tdaLista.Longitud(LRang)) do
  30.   Begin
  31.     tdaLista.Recuperar(Lrang, I, v1, cod); {recupera de la lista Lrang el elemento v1, en la posicion I, devuelve un codigo cod tambien}
  32.     Inc(I);
  33.     tdaLista.Localizar(Lrang, v1, pos, cod); {Localiza v1, en la lista lrang, si no lo encuentra cod<>0 else cod=0 y en pos devuelve la posicion del mismo}
  34.     
  35.     While (I<=tdaLista.Longitud(Lrang)) and (cod=0) do
  36.     Begin
  37.       tdaLista.Recuperar(Lrang, I ,v1, cod);
  38.       tdaLista.Localizar(L, v1, pos, cod);
  39.       Inc(I);
  40.     end;
  41.   end;
  42.   If (I<=tdaLista.Longitud(LRang)) or (IgualRotulo(v1,v2)) then
  43.   Begin
  44.     if (IgualRotulo(v1, v2)) and (tdaLista.Longitud(C)<tdaLista.Longitud(L)) then tdaLista.AsignarLista(L, C) else
  45.     if Not (IgualRotulo(v1, v2)) then CaminoMasLargoAux(G, v1,v2, c, L);
  46.   end;
  47.   tdaLista.Eliminar(L, tdaLista.Longitud(L), cod);
  48. end;
  49.  
  50.  
  51.  


Listo, que les parece, se entiende o no?.
PD: Los procedimientos y funciones tiene nombres significativos!!! Asique por ejemplo: igualRotulo(v1,v2) simplemente devuelve true si v1=v2 sino false}


Mas que Gracias !!!!!  :)