{------------------------------------------------------------------------------------------------------}
Procedure CaminoMasLargo(G:tdigrafo; v1,v2:trotulo; var c:tdaLista.Lista; var cod:integer);
var
cjto:tdaCjtoD.conjunto; L:tdaLista.lista;
Begin
  if not DigrafoVacio(G) then
  Begin
    tdaLista.VaciarLista(C);
    Dominio(g, cjto); {procedimiento que transforma el dominio del mapeo en un conjunto}
    if (tdaCjtoD.Pertenencia(v1, cjto)) and (tdaCjtoD.Pertenencia(v2, cjto)) then
    Begin
      tdaLista.CrearLista(L); CaminoMasLargoAux(g, v1, v2, c, L);
      tdaLista.Insertar(c, tdaLista.longitud(C)+1, v2, cod);
          {Lista, posicion en la lista, elemento, codigo de error}
    end;
  end else cod:=4
end;
{---------------------------------------------------------------------------------------------------}
Procedure CaminoMasLargoAux(G:Tdigrafo; v1,v2:trotulo; var c,L:tdaLista.lista);
var
Lrang:tdaLista.Lista; I,cod,pos:integer;
Begin
  tdaLista.Insertar(L, tdaLista.longitud(L)+1, v1, cod);
  Valor(G, v1, Lrang, cod); {procedimiento del TDAMapeoAMucho que dado un dominio (=trotulo) te devuelve el rango en este caso Lrang}
  I:=1;
  
  While (I<=tdaLista.Longitud(LRang)) do
  Begin
    tdaLista.Recuperar(Lrang, I, v1, cod); {recupera de la lista Lrang el elemento v1, en la posicion I, devuelve un codigo cod tambien}
    Inc(I);
    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}
    
    While (I<=tdaLista.Longitud(Lrang)) and (cod=0) do
    Begin
      tdaLista.Recuperar(Lrang, I ,v1, cod);
      tdaLista.Localizar(L, v1, pos, cod);
      Inc(I);
    end;
  end;
  If (I<=tdaLista.Longitud(LRang)) or (IgualRotulo(v1,v2)) then
  Begin
    if (IgualRotulo(v1, v2)) and (tdaLista.Longitud(C)<tdaLista.Longitud(L)) then tdaLista.AsignarLista(L, C) else
    if Not (IgualRotulo(v1, v2)) then CaminoMasLargoAux(G, v1,v2, c, L);
  end;
  tdaLista.Eliminar(L, tdaLista.Longitud(L), cod);
end;