// Tous les chemins entre deux sommets donnés // Version récursive (DFS) #include #include #include using namespace std; // Graphe orienté représenté par une liste d'adjacences class Graph { private: int V; // nombre de sommets list *adj; // liste d'adjacence // Fonction récursive pour trouver tous les chemins void printAllPathsUtil(const int, const int, vector &, vector &); public: Graph(int V); // constructeur void addEdge(const int u, const int v); // ajout d'un arc void printAllPaths(const int s, const int d); // affichage des chemins }; // class Graph Graph::Graph(const int V) // constructeur { this->V = V; adj = new list[V]; } // Graph() void Graph::addEdge(const int u, const int v) // ajout d'un arc u -> v { adj[u].push_back(v); } // addEdge() // Tous les chemins de s à d void Graph::printAllPaths(const int s, const int d) { // Marquer tous les sommets comme non visités vector visited(V, false); vector path; // chemin vide // Fonction récursive pour trouver tous les chemins de s à d printAllPathsUtil(s, d, visited, path); } // printAllPaths() void Graph::printAllPathsUtil(const int u, const int d, vector &visited, vector &path) { visited[u] = true; // marquer u comme visité path.push_back(u); if(u == d) // destination atteinte ! { for(int x : path) cout << x << ' '; cout << '\n'; } else { // Appels récursifs sur tous les voisins directs de u non visités for(int v : adj[u]) if(!visited[v]) printAllPathsUtil(v, d, visited, path); } // BACKTRACK path.pop_back(); visited[u] = false; } // printAllPathsUtil() // Programme principal int main() { int V = 0, A = 0; cin >> V >> A; // sommets, arcs Graph graphe(V); int x, y; for(int k = 0; k < A; k++) { cin >> x >> y; graphe.addEdge(x, y); } int s = 0, d = V - 1; graphe.printAllPaths(s, d); return 0; } // main()