Fala, pessoal!
Escrevi o algoritmo para encontrar as componentes conexas de um grafo, mas, quando executo a partir de um grafo muito grande, é gerada a exceção de estouro de pilha. Ela acontece exatamente na primeira linha da função visiterVoisins, mas não entendo a causa.
O código das funções envolvidas segue a abaixo. Agradeço desde já se alguém puder ajudar.
Desculpem-me pela identação, mas não consegui fazê-la neste editor do forum.
Abraços!
-----
private void initComposantes(Enumeration<Integer> keys, Hashtable<Integer, Sommet> sommets)
{
Integer keySommetActuel;
Sommet sommetActuel;
while(keys.hasMoreElements()) // pour tous les sommets
{
keySommetActuel = keys.nextElement();
sommetActuel = sommets.get(keySommetActuel);
sommetActuel.setComposanteConnexe(-1);
}
}
/*
* Pour chaque sommet, visite la liste de ses voisins pour marquer que il est dans
* la meme composante connexe
*/
private void visiterVoisins(Hashtable<Integer, Sommet> sommets, int keySommetActuel, int composante)
{
Sommet sommetActuel = sommets.get(keySommetActuel); // A exceção é lançada aqui!
Vector<Successeur> voisins = sommetActuel.getSucc();
Successeur succ;
int numeroVoisin;
sommetActuel.setComposanteConnexe(composante);
Iterator<Successeur> it = voisins.iterator();
while(it.hasNext())
{
succ = it.next();
numeroVoisin = succ.getNumero(); // prend la cle du voisin actuel
// Si le voisin actuel n'a pas encore ete visite
if(sommets.get(numeroVoisin).getComposanteConnexe() == -1)
visiterVoisins(sommets, numeroVoisin, composante);
}
}
/*
* Calcul des composantes connexes du graphe
*/
public void connexite (PrintStream sortie, Graphe graphe, boolean display)
{
Hashtable<Integer, Sommet> sommets = graphe.getGraphe();
Enumeration<Integer> keys = sommets.keys();
Sommet sommetActuel;
int keySommetActuel;
int composanteActuelle = 0;
String chaine = new String();
sortie.println("** Composante connnexe de chaque sommet");
this.initComposantes(keys, sommets); // marque tous les sommets avec -1
keys = sommets.keys(); // recommence l'enumeration
while(keys.hasMoreElements())
{
keySommetActuel = keys.nextElement();
sommetActuel = sommets.get(keySommetActuel);
// si le sommet n'a pas encore ete visite
if(sommetActuel.getComposanteConnexe() == -1)
// met ses voisins dans la meme composante
visiterVoisins(sommets, keySommetActuel, ++composanteActuelle);
chaine = "\n" + keySommetActuel + " " + composanteActuelle + chaine;
}
sortie.println(composanteActuelle + "\n" + chaine);
sortie.close();
}
-----