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; }
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 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; }