Bonjour à tous,
Je viens d'essayer la méthode avec l'algo proposé mais je n'arrive pas à le faire fonctionner sur java et j'avoue ne pas bien comprendre le déroulement de l'algorithme
pour trouver tous les chemins possibles entre deux points donnés dans un graphe orienté.
A force de me creuser la tête j'ai réussis à trouver une méthode me trouvant un chemin possible mais je n'arrive pas à me servir de la récursivité dans ma méthode pour tous les trouver. Car si mon sommet est marqué alors il n'y repasse pas alors que moi je ne veux pas qu'il repasse par un sommet déjà marqué dans un chemins mais dans les autres chemins, je veux qu'il puisse y retourner ! ^^
Voici mon code :
ma classe hérite d'une classe graphe où dans cette classe se trouve plusieurs méthode comme la liste des successeurs d'un sommet (réc ses prédécesseurs), le nombre de sommets etc.
Pouriez-vous m'aider, sur mon code, à l'améliorer et me permettre de trouver tous les chemins possibles.Code:import java.util.*; public class Cheminement extends Graphe{ //Vecteur dans lequel je stock mon chemin private Vector<Integer> tab= new Vector<Integer>(); //tableau de boolean pour marquer un sommet et savoir s'il a déjà été visité private boolean [] marque = new boolean[1000]; public void chemins(Graphe g, int depart, int arrivee){ int courant = depart; for(int i=0; i<g.nbSommet(); i++){ marque[i] = false; } //Une pile P qui se rempli et se vide au fur et à mesure et permet de sortir de ma boucle while Stack<Integer> P = new Stack<Integer>(); marque[depart] = true; P.push(depart); while(!(P.isEmpty()) && courant!=arrivee){ courant = P.pop(); tab.add(courant); for(int i=0; i<g.lst_succ(courant).length; i++){ if(marque[g.lst_succ(courant)[i]] == false){ P.push(g.lst_succ(courant)[i]); marque[g.lst_succ(courant)[i]] = true; }//fsi }//fpour }//fwhile }//CheminHami public java.lang.String toString(){ String str = "chemin : { "; for(int i=0; i<tab.size(); i++){ str+= tab.get(i) + ", "; } str+="}"; return str; } public static void main(String[] args) { Cheminement c1 = new Cheminement(); int A = Graphe.Alpha_NotDef; //Permet de dire qu'il n'y a pas d'arc entre les sommets int [][]mat = {{A,2,2,A,A,A}, {A,A,A,A,2,A}, {A,2,A,2,A,A}, {A,A,A,A,A,2},{A,A,2,2,A,A}, {A,A,A,A,2,A}}; //Matrice d'adjacence de mon graphe g Graphe g = new Graphe(mat); //Mon graphe g construit avec le constructeur par matrice c1.chemins(g, 0, 5); System.out.println(c1); } }
Si je ne nme trompe pas, avec ce graphe (donc avec cette matrice d'adjacence), tous les chemins possibles entre le sommet 0 et le sommet 5 sont :
0; 1; 4; 3; 5
0; 1; 4; 2; 3; 5
0; 2; 1; 4; 3; 5
0; 2; 3; 5
Parce que mon but final est de trouver tous les chemins possible reliant deux sommets passant par tous les sommets du graphe.
Merci BEAUCOUP !!!
-----