/** 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 localidade na estrutura */
 public boolean addLocalidade(Localidade localidade) {
   if (this.localidades.containsKey(localidade.get_Nome())) return false;
   else {
     this.localidades.put(localidade.get_Nome(), localidade.clone());
     return true;
   }
 }
  /** Metodo que le os clientes de um ficheiro */
  public void lerLocalidades(String fileLocalidades, String fileLigacoes, int nrlocalidades)
      throws FileNotFoundException, IOException {
    BufferedReader readLoc = new BufferedReader(new FileReader(fileLocalidades));
    BufferedReader readLig = new BufferedReader(new FileReader(fileLigacoes));
    int nrligacoes;

    while (readLoc.ready() && nrlocalidades > 0) {

      String linhaLoc = readLoc.readLine();
      StringTokenizer stLoc = new StringTokenizer(linhaLoc, "|");
      nrligacoes = stLoc.countTokens() - 2;
      Localidade localidade = new Localidade(stLoc.nextToken(), stLoc.nextToken());

      while (nrligacoes > 0 && readLig.ready()) {
        String linhaLig = readLig.readLine();
        StringTokenizer stLig = new StringTokenizer(linhaLig, "|");
        stLig.nextToken();
        Ligacao lig =
            new Ligacao(
                stLig.nextToken(),
                Double.valueOf(stLig.nextToken()),
                Double.valueOf(stLig.nextToken()));
        localidade.addLigacao(lig);
        nrligacoes--;
      }
      this.addLocalidade(localidade);
      nrlocalidades--;
    }
    readLoc.close();
    readLig.close();
  }
 /** Metdo que remove uma ligação */
 public boolean removeligacao(Ligacao ligacao, String partida) {
   if (this.localidades.containsKey(partida)) {
     Localidade aux = this.localidades.get(partida);
     return aux.removeLigacao(ligacao);
   }
   return false;
 }
 /** 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;
 }
  /** Metodo que devolve a estrutura de Localidades */
  public Map<String, Localidade> get_Localidades() {
    Map<String, Localidade> res = new TreeMap<String, Localidade>();
    Collection<Localidade> coll = this.localidades.values();

    for (Localidade l : coll) res.put(l.get_Nome(), l.clone());

    return res;
  }
  /** Metodo que remove uma localidadade da estrutura de localidades */
  public boolean removeLocalidade(Localidade localidade) {
    if (this.localidades.containsKey(localidade.get_Nome())) {
      Ligacao lig = new Ligacao(localidade.get_Nome(), 0, 0);
      Collection<Localidade> coll = this.localidades.values();

      for (Localidade aux : coll) aux.removeLigacao(lig);

      this.localidades.remove(localidade.get_Nome());
      return true;
    }
    return false;
  }
  /** 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;
  }
 /** Metodo que adiciona varias localidades na estrutura */
 public void addLocalidades(Collection<Localidade> localidades) {
   for (Localidade l : localidades) this.addLocalidade(l.clone());
 }