Un cap pour ce chapitre
Ce que vous saurez faire
- Reconstruire un chemin par prédécesseurs.
- Distinguer arcs orientés et arêtes non orientées.
- Expliquer une détection de cycle adaptée au modèle.
Les bases utiles pour commencer
Préciser le sens d’un chemin
Un chemin est une succession de sommets reliés conformément aux liaisons du graphe. Dans un graphe orienté, chaque arc doit être suivi dans son sens. A→B n’autorise pas automatiquement B→A. L’accessibilité dépend donc du point de départ et n’est pas nécessairement réciproque.
Pour fournir un témoin d’accessibilité, on donne un chemin concret. Pour montrer une impossibilité, on peut parcourir tous les sommets accessibles depuis le départ et constater que la destination n’en fait pas partie. Une exploration arrêtée trop tôt ne suffit pas à prouver l’absence de route.
Par convention, un sommet est accessible depuis lui-même par un chemin de longueur zéro. Cela ne prouve pas qu’il existe un cycle : aucun arc n’a été parcouru. Distinguez explicitement ce chemin vide en liaisons d’un trajet non vide qui revient à son départ.
Conserver le prédécesseur de découverte
Lorsqu’un parcours découvre v depuis u, on enregistre u comme prédécesseur de v. Une fois la destination trouvée, on remonte ces liens jusqu’au départ puis on inverse la liste. Cette technique évite de conserver à chaque instant toutes les routes possibles.
Si pred[D]=B et pred[B]=A, on reconstitue D,B,A puis A,B,D. Le départ doit posséder un marqueur d’arrêt, comme None. Une destination non découverte n’a pas de chaîne valide à remonter. Avec BFS dans un graphe non pondéré, le chemin ainsi reconstruit possède un minimum d’arêtes.
Détecter un cycle dans un graphe non orienté simple
Dans un graphe simple non orienté, parcourir l’arête A-B depuis A puis constater que B voit A ne suffit pas à déclarer un cycle : c’est la même arête examinée dans l’autre sens. Une recherche en profondeur doit distinguer le parent de découverte des autres voisins déjà visités.
Si l’on rencontre un voisin déjà découvert qui n’est pas le parent dans ce modèle, une liaison supplémentaire referme un trajet et révèle un cycle. Le graphe A-B, B-C forme une chaîne sans cycle ; ajouter C-A crée le cycle A-B-C-A. Les multigraphes ou les boucles exigent des conventions supplémentaires et ne sont pas supposés ici.
Dans un graphe orienté, suivre les sommets actifs
Pour un DFS orienté, il faut distinguer un sommet encore dans la pile des appels d’un sommet dont l’exploration est terminée. Un arc vers un ancêtre encore actif referme un cycle dirigé. Un arc vers un sommet terminé ne prouve pas nécessairement un cycle.
Le graphe A→B, A→C, C→B est sans cycle, bien que C puisse rencontrer B déjà visité. Ajouter B→A crée au contraire A→B→A. Une classification « inconnu, actif, terminé » permet de raisonner proprement. Comme souvent en algorithmique, mémoriser seulement un booléen peut être insuffisant lorsque la question demande une distinction plus fine.
Voici une détection complète pour un graphe orienté fini donné par listes de successeurs. Les états 1 et 2 représentent actif et terminé. La boucle extérieure traite aussi les zones qui ne sont pas accessibles depuis le premier sommet.
def a_un_cycle_oriente(graphe):
etat = {sommet: 0 for sommet in graphe}
def explorer(u):
etat[u] = 1
for v in graphe[u]:
if etat[v] == 1:
return True
if etat[v] == 0 and explorer(v):
return True
etat[u] = 2
return False
for u in graphe:
if etat[u] == 0 and explorer(u):
return True
return FalseExemple suivi : distinguer trois couleurs
Dans le graphe orienté A→B, A→C, C→B, commençons DFS en A et examinons B avant C. A devient actif, puis B devient actif. Comme B n’a aucun successeur, il termine. A explore ensuite C ; C rencontre B déjà terminé. Cet arc ne remonte pas vers un appel actif et ne crée aucun chemin de retour depuis B. Le graphe reste sans cycle.
Ajoutons maintenant B→A. Lorsque B examine A, celui-ci est encore actif : A attend justement le retour de B. Les arcs A→B et B→A forment un cycle dirigé. Un tableau à trois états, inconnu, actif, terminé, conserve l’information nécessaire. Un booléen « déjà vu » confondrait B terminé dans le premier scénario et A actif dans le second. La structure de mémoire dépend donc de la propriété recherchée.
Exemple suivi : une route inverse et un témoin local
Dans la chaîne non orientée A-B-C, les prédécesseurs depuis C sont B←C et A←B. La remontée depuis A donne A,B,C ; l’inversion fournit C,B,A. Le trajet utilise les arêtes dans le sens inverse de leur écriture initiale, ce qui est autorisé parce qu’elles ne sont pas orientées. Le dessin doit surligner les mêmes deux liaisons, quelle que soit la direction du trajet.
La présence d’un cycle est une propriété du graphe considéré, tandis qu’un chemin dépend aussi du départ et de la destination. Dans un graphe comportant plusieurs composantes, un cycle peut se trouver hors de la zone atteignable depuis le départ. Une détection globale doit alors relancer DFS sur les sommets encore inconnus. Pour prouver un chemin, une suite valide suffit ; pour prouver une absence, explorez tout ce qui est accessible ou utilisez une contrainte structurelle claire, comme l’absence de successeur au départ.
À vous de faire varier les choses
Ajoutez le lien qui change la conclusion
Comparez deux graphes orientés et deux graphes non orientés. Choisissez ensuite le départ et la destination pour tester l’accessibilité.
Lire le résultat de l’expérience initiale
Chemin : A → C.
Les flèches sont données dans le tableau des arcs ; leur sens doit être respecté.
| Origine de l’arc | Destination ou autre extrémité |
|---|---|
| A | B |
| A | C |
| C | B |
La présence d’un sommet déjà connu n’a de sens qu’avec l’orientation et l’état précis du parcours.
De la compréhension à l’autonomie
À vous de résoudre
Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.
Respecter une orientation
Les seuls arcs sont A→B et B→C. Existe-t-il un chemin de A à C ? Et de C à A ?
Indice 1
Suivez uniquement le sens indiqué.
Indice 2
Aucun arc ne part de C.
Comprendre la correction
A→B→C est un chemin de A à C. Il n’existe pas de chemin de C à A dans ce graphe, car C n’a aucun successeur. L’accessibilité n’est pas symétrique dans un graphe orienté.
Remonter un chemin
On connaît pred[E]=C, pred[C]=A, pred[A]=None. Quel chemin du départ vers E ces données décrivent-elles ?
Indice 1
La remontée commence par E.
Indice 2
Inversez la séquence pour la lecture du trajet.
Comprendre la correction
La remontée produit E,C,A ; le chemin demandé est A,C,E. Le marqueur None arrête la reconstruction. Ces prédécesseurs décrivent une route sélectionnée, pas nécessairement toutes les routes possibles.
Écarter un faux cycle
Dans le graphe non orienté réduit à l’arête A-B, B rencontre A déjà visité pendant DFS. Pourquoi cela ne constitue-t-il pas un cycle simple ?
Indice 1
A est le parent de B.
Indice 2
L’exploration voit deux fois la même arête.
Comprendre la correction
Le retour vers A correspond à l’arête par laquelle B a été découvert. Il ne forme pas un cycle simple avec des arêtes distinctes. La détection doit ignorer cette liaison vers le parent dans le graphe simple non orienté.
Distinguer visité et actif
Dans A→B, A→C, C→B, un DFS traite entièrement B avant C. L’arc C→B prouve-t-il un cycle ?
Indice 1
B est-il encore dans la pile active ?
Indice 2
Existe-t-il un trajet de B vers C ou A ?
Comprendre la correction
Non. B est terminé et ne possède aucun arc de retour dans ce graphe. La rencontre d’un sommet visité ne suffit pas en orienté. Il faut notamment distinguer un sommet actif sur le chemin courant d’un sommet déjà complètement exploré.
Problème : séparer accessibilité et cycle
On considère A→B, A→C, C→B. Donnez un chemin de C à B, dites si B peut atteindre C et si le graphe contient un cycle. Ajoutez B→A puis répondez de nouveau. Quel cycle fournit un témoin concret ?
Indice 1
B n’a initialement aucun successeur.
Indice 2
Après ajout, B peut passer par A.
Comprendre la correction
Initialement C→B existe, B n’atteint pas C et le graphe est sans cycle. Après ajout, B→A→C atteint C et A→B→A est un cycle. Le chemin de C à B reste valide. Ajouter un arc peut créer de nouvelles accessibilités sans supprimer les chemins déjà présents.
Problème : éviter le faux positif du parent
Dans la chaîne non orientée A-B-C-D, partez de A et donnez les parents de découverte. Pour chaque sommet non racine, quelle arête retour doit être ignorée lors du test de cycle ? Ajoutez D-B : donnez un cycle et expliquez pourquoi cette arête ne relève pas de la même exception.
Indice 1
Un parent est défini par la première découverte.
Indice 2
D-B n’est pas l’arête par laquelle D a été découvert.
Comprendre la correction
Les parents sont A pour B, B pour C et C pour D. Les retours B-A, C-B et D-C examinent les arêtes d’entrée et ne prouvent aucun cycle simple. D-B est une liaison supplémentaire vers un ancêtre distinct du parent ; elle referme B-C-D-B, également parcourable dans le sens B-D-C-B. L’exception du parent évite de compter deux fois la même arête sans ignorer les véritables retours.
Problème : reconstruire sans inventer
Un parcours depuis S fournit pred[S]=None, pred[A]=S, pred[B]=A et aucune entrée pour T. Reconstituez le chemin vers B, celui vers S et indiquez les vérifications nécessaires avant de tenter T. Une absence de parent de S signifie-t-elle la même chose qu’une absence d’entrée pour T ?
Indice 1
Le départ possède une entrée avec un marqueur d’arrêt.
Indice 2
Une cible non découverte n’a pas de chaîne à remonter.
Comprendre la correction
Le chemin vers B est S-A-B ; celui vers S est [S], de longueur zéro. S est connu et son marqueur termine la reconstruction. T n’est pas découvert : il faut attendre la fin de l’exploration pour conclure à son inaccessibilité, puis ne pas remonter de parents inexistants. Confondre marqueur de racine et clé absente rendrait les cas limites incorrects.
Les erreurs qui méritent un détour
- Déclarer un cycle pour tout voisin déjà visité.
- Le parent en non orienté et les sommets terminés en orienté nécessitent des traitements distincts.
- Remonter les prédécesseurs d’une destination inconnue.
- Vérifiez d’abord que la destination a été découverte.
La fiche à garder
L’essentiel à retenir
- Un chemin respecte le sens des arcs.
- Les prédécesseurs fournissent un témoin d’accessibilité.
- La détection de cycle dépend de l’orientation et de l’état du parcours.
Cette notion au bac
Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.
- Bac 2025 · Métropole · Remplacement jour2 - 10 septembre 2025 : Commandes SQL et itinéraires de livraison
- Bac 2025 · Centres étrangers groupe 1 · Jour 2 : Diviseurs et multiples : énumérer les chemins sans répétition
- Bac 2025 · Nouvelle-Calédonie · Jour 2 : Jonglerie : construire puis parcourir un automate de siteswaps
Le prochain pas
Retrouver le catalogue de Terminale
Ce chapitre s’appuie sur le programme officiel de Terminale (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.
