Estou fazendo um programa em java para uma matéria de grafos da faculdade. Estou implementando o algoritmo de kruskal, que transforma um grafo qualquer em uma árvore (grafo acíclico) com o menor custo posspivel. Esse algorítmo deve organizar os arcos (ou arestas valoradas, representadas por beans) por custo, e então ir criando a árvore caso o arco não forme um ciclo. O algorítmo foi implementado, e está funcionando semi-perfeitamente. Segue minha função formaCiclo()
Ps:. um grafo é formado por beans Vertice e beans Aresta, sendo esta ultima formada por dois beans Vertices e um custo (valor)
private boolean formaCiclo(Aresta aresta) {
boolean retorno = false;
Vertice x = aresta.getX();
Vertice y = aresta.getY();
ArrayList adjX = this.arvore.verticesAdjacentes2(x);
setPermitir(true);
this.arvore.desvisitarVertices();
x.setVisitado(true);
return procurarConvergencia(adjX, y);
}
private boolean procurarConvergencia(ArrayList adjX, Vertice y) {
boolean retorno = false;
if (!adjX.isEmpty()) {
for (int i = 0; i < adjX.size(); i++) {
Vertice vertice1 = (Vertice) adjX.get(i);
synchronized (this) {
if (!getPermitir())
break;
}
if (!vertice1.isVisitado()) {
vertice1.setVisitado(true);
if (vertice1.getValor() == y.getValor()) {
retorno = true;
synchronized(this){
setPermitir(!retorno);
break;
}
} else {
retorno = procurarConvergencia(this.arvore
.verticesAdjacentes2(vertice1), y);
}
}
}
}
return retorno;
}
private synchronized boolean getPermitir() {
return this.permitir;
}
private synchronized void setPermitir(boolean bol) {
this.permitir = bol;
}
Eh, eu sei, tá uma gambiarra medonha, usando até mesmo for para percorrer uma Collection. Mas enfim…
O algorítmo funciona perfeitamente quando defino um grafo em uma classe e nessa mesma classe chamo o algoritmo. Mas quando uso uma interface gráfica
para criar os grafos, pegando os vertices e as arestas, o algoritmo não funciona. Ele não dá erro, simplesmente não funciona corretamente, o MESMO grafo criado quando definido na classe é transformado corretamente mas quando uso uma interface ele não funciona corretamente.
O mesmo acontece em dois outros algoritmos que utilizo recursividade, o algoritmo da busca por amplitude. Em uma classe onde defino o grafo ele funciona perfeitamente, mas O MESMO GRAFO definido pelo usuario com uma interface gráfica ele não funciona corretamente.
Alguem tem alguma ideia de como posso resolver esse problema?
Desde já meu muito obrigado!