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;
  }
  /** Metodo que escreve os clientes num ficheiro */
  public void escreveLocalidades(String fileLocalidades, String fileLigacoes, int nrlocalidades)
      throws FileNotFoundException, IOException {
    PrintWriter printloc = new PrintWriter(fileLocalidades);
    PrintWriter printlig = new PrintWriter(fileLigacoes);

    Collection<Localidade> coll = this.localidades.values();

    for (Localidade l : coll) {
      printloc.print(l.get_Codigopostal() + "|" + l.get_Nome());

      Map<String, Ligacao> ligacoes = l.get_Ligacoes();
      int nrligacoes = ligacoes.size();

      Collection<Ligacao> colllig = ligacoes.values();

      for (Ligacao lig : colllig) {
        printloc.print("|1");
        printlig.println(
            l.get_Codigopostal()
                + "|"
                + lig.get_Localidaded()
                + "|"
                + lig.get_Distancia()
                + "|"
                + lig.get_Taxas());
      }
      printloc.print("\n");

      nrlocalidades--;
      if (nrlocalidades == 0) break;
    }

    printloc.close();
    printlig.close();
  }
 /** Metodo que adiciona uma ligação */
 public boolean addLigacao(Ligacao ligacao, String partida) {
   if (this.localidades.containsKey(partida)) {
     Localidade aux = this.localidades.get(partida);
     return aux.addLigacao(ligacao.clone());
   }
   return false;
 }
  /*
   *Excluir registro da base de dados
   *@param chave do registro a ser excluido
   *@return verdadeiro para exclusao bem sucedida
   */
  public boolean excluir(Object chave) {
    boolean ok = false;
    String chaveFormatada = chaveFormatada(chave);

    DeleteSqlBD sql = new DeleteSqlBD();
    sql.setTabela(ligacao.getTabela());
    sql.insereCondicao(_campoChave + " = " + chaveFormatada);

    if (ServidorBD.executaUpdate(sql.getQuery()) == 1) {
      ok = true;
    }

    return ok;
  }
  /*
   *Buscar posicao do ultimo registro
   *@return chave para ultimo registro encontrado
   */
  public Object buscarUltimo() {
    Object ultimo = null;

    SelectSqlBD sql = new SelectSqlBD();
    sql.setTabela(ligacao.getTabela());
    sql.insereColuna(_campoChave, "chave", "max");
    TabelaBD reg = ServidorBD.executaQuery(sql.getQuery());

    if (reg.primeiro() && reg.getColuna("chave") != null) {
      ultimo = reg.getColuna("chave");
    }

    return ultimo;
  }
  private Object buscarPosicao(Object chave, String criterio, String condicao) {
    Object registro = null;
    String chaveFormatada = chaveFormatada(chave);

    SelectSqlBD sql = new SelectSqlBD();
    sql.setTabela(ligacao.getTabela());
    sql.insereColuna(_campoChave, "chave", condicao);
    sql.insereCondicao(_campoChave + criterio + chaveFormatada);
    TabelaBD reg = ServidorBD.executaQuery(sql.getQuery());

    if (reg.primeiro() && reg.getColuna("chave") != null) {
      registro = reg.getColuna("chave");
    }

    return registro;
  }
  /**
   * Procurar campo especifico baseado em seu conteudo
   *
   * @param nomeCampo
   * @param chave
   * @param campoDescricao
   * @return
   */
  public Object[][] procurarCampo(String nomeCampo, String chave, String campoDescricao) {
    Object[][] resultado = null;

    SelectSqlBD sql = new SelectSqlBD();
    sql.setTabela(ligacao.getTabela());
    sql.insereColuna(_campoChave);
    sql.insereColuna(campoDescricao);
    sql.insereCondicao(nomeCampo + " LIKE " + chave);
    TabelaBD reg = ServidorBD.executaQuery(sql.getQuery());
    int numRegistros = reg.getTotalRegistros();

    if (numRegistros > 0) {
      resultado = new Object[numRegistros][2];
      reg.primeiro();
      for (int i = 0; i < numRegistros; i++) {
        resultado[i][0] = chaveFormatada(reg.getColuna(0));
        resultado[i][1] = reg.getColuna(1);
        reg.proximo();
      }
    }

    return resultado;
  }
 /**
  * Informa a tabela base
  *
  * @return nome da tabela
  */
 public String getTabela() {
   return ligacao.getTabela();
 }