private int distancia_aux(
      Map<String, Ligacao> ligacoes,
      DijElem elemAct,
      HashMap<String, DijElem> elementos,
      int greycount) {
    Collection<Ligacao> coll = ligacoes.values();
    int grey = greycount;

    for (Ligacao lig : coll) {
      DijElem target = elementos.get(lig.get_Localidaded());

      if (target != null
          && (target.get_Vis() != _VIS_BLACK)
          && (target.get_Nrlocalidades() > (elemAct.get_Nrlocalidades() + 1))) {
        target.set_Nrlocalidades(elemAct.get_Nrlocalidades() + 1);
        target.set_Pai(elemAct.get_Nome());
      } else if (target == null) {
        target =
            new DijElem(
                lig.get_Localidaded(),
                elemAct.get_Nrlocalidades() + 1,
                elemAct.get_Nome(),
                _VIS_GREY);

        grey++;

        elementos.put(lig.get_Localidaded(), target.clone());
      }
    }

    return grey;
  }
  private DijElem verificaproxnodo(HashMap<String, DijElem> elementos) {
    DijElem prox = null;

    Collection<DijElem> coll = elementos.values();

    for (DijElem elem : coll) {
      if (elem.get_Vis() != _VIS_BLACK
          && (prox == null || prox.get_Nrlocalidades() > elem.get_Nrlocalidades())) {
        prox = elem;
      }
    }

    return prox;
  }
  /** Metodo que calcula o nr localidades entre 2 localidades */
  public int distancia(String partida, String destino, Vector<String> caminho) {
    HashMap<String, DijElem> elementos =
        new HashMap<String, DijElem>((int) (this.localidades.size() * 1.4));

    DijElem elemAct;
    Localidade localAct;

    elemAct = new DijElem(partida, 0, "", _VIS_GREY);

    elementos.put(elemAct.get_Nome(), elemAct.clone());

    int greycount = 1;
    while (greycount > 0) {
      elemAct = null;
      elemAct = verificaproxnodo(elementos);

      if (elemAct == null) return -1;

      localAct = this.localidades.get(elemAct.get_Nome());

      if (localAct == null) return -1;

      greycount = distancia_aux(localAct.get_Ligacoes(), elemAct, elementos, greycount);

      elemAct.set_Vis(_VIS_BLACK);

      if (elemAct.get_Nome().equals(destino)) {
        caminho.add(destino);

        DijElem pcaminho = elemAct;
        while (!pcaminho.get_Pai().equals("")) {
          caminho.add(pcaminho.get_Pai());
          pcaminho = elementos.get(pcaminho.get_Pai());
        }

        return elemAct.get_Nrlocalidades();
      }

      greycount--;
    }
    return -1;
  }