Numérique et sciences informatiques (spécialité) · TerminaleBac
Parcours de graphes (largeur, profondeur) : cours de NSI Terminale
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Un parcours visite les sommets d'un graphe à partir d'une source, chacun une seule fois grâce au marquage des sommets déjà vus.4
- Le parcours en largeur (BFS) utilise une file : il explore la source, puis ses voisins, puis les voisins de ses voisins.4
- Le parcours en profondeur (DFS) s'enfonce dans un chemin jusqu'à un cul-de-sac, puis revient en arrière ; il s'écrit naturellement en récursif, ou avec une pile.54
- Le BFS donne les distances depuis la source dans un graphe non pondéré ; les deux parcours donnent les sommets accessibles et les composantes connexes.45
- Pour choisir : plus court chemin en nombre d'arêtes, c'est le BFS ; exploration exhaustive d'un chemin, c'est le DFS.
Pourquoi parcourir un graphe ?
Tu as déjà travaillé sur les arbres binaires : à partir de la racine, tu sais visiter tous les nœuds, en passant par les sous-arbres gauche et droit. Un graphe généralise cette situation. Il n'y a plus de racine imposée, un sommet peut être relié à plusieurs autres, et on peut revenir par un autre chemin sur un sommet déjà rencontré.
On veut pourtant répondre à des questions très concrètes : est-ce que je peux aller du sommet A au sommet G ? Combien d'arêtes faut-il traverser au minimum ? Le réseau est-il en un seul morceau ? Pour y répondre, il faut un procédé systématique qui visite les sommets sans en oublier et sans tourner en rond. C'est le rôle des algorithmes de parcours.
Deux parcours sont au programme de la spécialité NSI : le parcours en largeur et le parcours en profondeur.12 Dans ce cours, tu vas :
- comprendre l'idée de chacun, avec des schémas de déroulement pas à pas ;
- les écrire en Python, avec le bon outil (file, pile ou récursivité) ;
- savoir lequel choisir selon la question posée, et les utiliser pour calculer des distances et des composantes connexes.
Rappels : graphe, voisins, chemins et représentation en Python
Le parcours en largeur (BFS)
Le fonctionnement repose sur une file : on sort le sommet qui est en tête, puis on range tout au bout de la file ceux de ses voisins qui n'ont pas encore été vus.4 Comme une file ressort les éléments dans l'ordre où ils sont arrivés (premier entré, premier sorti), les sommets découverts les premiers sont aussi traités les premiers. C'est ce qui garantit l'exploration « couche par couche ».
Pour ne jamais explorer deux fois le même sommet, on marque les sommets déjà visités.4 Sans ce marquage, un graphe qui contient un cycle ferait tourner l'algorithme indéfiniment : on repasserait sans cesse par les mêmes sommets. Dans un arbre, aucun cycle n'existe et le marquage devient inutile.4
- InitialiserMettre la source dans la file et la marquer.
- DéfilerRetirer le sommet en tête de file.
- AjouterMarquer ses voisins et les ajouter en fin de file.
- RépéterRecommencer tant que la file n'est pas vide.
| Sommet défilé | File ensuite | Sommets marqués |
|---|---|---|
| A | B, C | A, B, C |
| B | C, D, E | A, B, C, D, E |
| C | D, E, F | A, B, C, D, E, F |
| D | E, F | A, B, C, D, E, F |
| E | F | A, B, C, D, E, F |
| F | G | A, B, C, D, E, F, G |
| G | vide | A, B, C, D, E, F, G |
Le parcours en largeur calcule des distances
Pourquoi cette propriété est-elle vraie ? Voici l'idée, qui est un raisonnement et non une démonstration complète. Au départ, la file contient seulement la source, à distance 0. Quand on la retire, on ajoute ses voisins, tous à distance 1. Quand on retire ensuite ces sommets à distance 1, on ajoute leurs voisins non marqués, qui sont à distance 2, et ils se placent derrière tous ceux de distance 1 déjà présents. Comme la file est respectée, on ne traite jamais un sommet à distance avant d'avoir traité tous les sommets à distance .
Pour exploiter cette propriété, il suffit de noter, pour chaque sommet découvert, la distance de son prédécesseur augmentée de 1.
Le parcours en profondeur (DFS)
Le principe est celui d'un promeneur têtu : depuis un sommet, il choisit un voisin et avance, puis choisit un voisin du voisin, et ainsi de suite. Il suit ainsi un chemin jusqu'à une impasse ou jusqu'à rencontrer un sommet déjà vu. Il remonte alors jusqu'au dernier sommet qui offrait une autre direction, et part explorer celle-ci. Le parcours prend fin quand tous les sommets atteignables depuis la source ont été vus.5
Le nom vient de cette manière d'aller « à fond » dans chaque chemin avant d'en essayer un autre, à l'inverse du parcours en largeur.5 Pour chaque sommet, on le marque, puis on prend le premier voisin non marqué, et ainsi de suite jusqu'à un sommet sans voisin à visiter ; on revient alors au sommet précédent.5
Comparer, choisir, utiliser
| Critère | Largeur (BFS) | Profondeur (DFS) |
|---|---|---|
| Structure | File | Pile ou récursivité |
| Exploration | Par couches autour de la source | Un chemin jusqu'au cul-de-sac, puis retour |
| Ordre sur le graphe fil rouge | A, B, C, D, E, F, G | A, B, D, E, F, C, G |
| Usage typique | Distances, plus courts chemins | Existence de chemin, labyrinthe |
Le parcours en largeur découvre le graphe par couches successives ; le parcours en profondeur le découvre en suivant un chemin le plus loin possible. Les deux visitent exactement les mêmes sommets : ceux qui sont accessibles depuis la source. Pour le parcours en profondeur, ces sommets sont précisément ceux que l'algorithme a marqués, qu'il s'agisse d'un graphe orienté ou non orienté.5 Le parcours en largeur atteint lui aussi tous les sommets accessibles depuis la source.4
Sur un graphe non orienté, la propriété d'accessibilité sert à calculer les composantes connexes.5 Le parcours en largeur permet aussi de tester si un tel graphe est connexe et d'en obtenir les composantes connexes, avec un coût linéaire par rapport à la taille du graphe.4
La méthode est la suivante. On part d'un sommet quelconque et on lance un parcours : tous les sommets marqués forment une première composante. S'il reste des sommets non marqués, on en choisit un et on relance un parcours depuis lui, en gardant les marques précédentes : on obtient la deuxième composante, et ainsi de suite. Le graphe est connexe si un seul parcours depuis un sommet quelconque a marqué tous les sommets.
Réussir les questions de parcours au bac
Exercices corrigés
Exercice 1 Dérouler les deux parcours à la main
On considère le graphe non orienté suivant, donné par ses listes de voisins rangés dans l'ordre alphabétique (le sommet S est la source) :
S:A,BA:C,SB:C,D,SC:A,B,ED:BE:C
- Donne l'ordre de visite d'un parcours en largeur depuis
S. - Donne l'ordre de visite d'un parcours en profondeur depuis
S. - Quelle est la distance de
SàE?
Indice 1
Pour la largeur, tiens à jour le contenu de la file après chaque sommet retiré.
Indice 2
Pour la profondeur, avance toujours vers le premier voisin non visité dans l'ordre alphabétique, et reviens en arrière seulement en cas de cul-de-sac.
Voir la correction pas à pas
Largeur : la file contient
S. On retireSet on ajouteAetB: fileA, B.On retire
A: son voisinCest nouveau, fileB, C. On retireB:Cest déjà marqué,Dest nouveau, fileC, D.On retire
C:Eest nouveau, fileD, E. On retireD, puisE. Ordre en largeur : S, A, B, C, D, E.Profondeur : on visite
S, puis son premier voisinA, puis le premier voisin non visité deA, c'est-à-direC.Depuis
C,Aest vu etBest nouveau : on visiteB. DepuisB,CetSsont vus,Dest nouveau : on visiteD, cul-de-sac, retour àB, puis àC.Depuis
C, le voisinEest nouveau : on le visite. Ordre en profondeur : S, A, C, B, D, E.Distance de
SàE:Eest découvert viaC, lui-même découvert viaA, découvert depuisS. Le chemin S, A, C, E compte 4 sommets donc 3 arêtes, et aucun chemin plus court n'existe puisqueEn'est voisin que deC, qui est à distance 2.
Les deux ordres diffèrent dès le troisième sommet : en largeur, B (voisin de S) passe avant C ; en profondeur, C est atteint par A avant que B soit visité. La distance, elle, se lit sur le parcours en largeur : E est découvert au troisième « cercle » autour de S.
Exercice 2 Compter les composantes connexes
Voici un graphe non orienté, avec les voisins de chaque sommet :
1:2,32:1,43:1,44:2,3,55:46:77:6
- Lance un parcours en profondeur depuis
1. Quels sommets sont marqués à la fin ? - Ce graphe est-il connexe ? Justifie.
- Combien de composantes connexes compte-t-il ?
Indice 1
Les sommets marqués à la fin d'un parcours sont exactement ceux accessibles depuis la source.
Indice 2
Relance un parcours depuis un sommet non marqué, en gardant les marques précédentes.
Voir la correction pas à pas
On visite
1, puis2(premier voisin), puis4(voisin de2).Depuis
4,2est vu et3est nouveau : on visite3. Les voisins de3,1et4, sont vus : retour à4.Depuis
4, le voisin5est nouveau : on le visite. Plus rien à explorer. Les sommets marqués sont 1, 2, 4, 3, 5 (dans cet ordre).Les sommets
6et7ne sont pas marqués : aucun chemin ne les relie à1. Le graphe n'est donc pas connexe.On relance un parcours depuis
6en gardant les marques : il atteint7et s'arrête. Cela donne une deuxième composante, {6, 7}.Tous les sommets sont désormais marqués : il y a 2 composantes connexes, {1, 2, 3, 4, 5} et {6, 7}.
Chaque nouveau lancement de parcours depuis un sommet non marqué correspond à une nouvelle composante. C'est exactement ce que compte la fonction nb_composantes du cours.
Exercice 3 Écrire une fonction d'accessibilité
On représente un graphe par un dictionnaire d'adjacence, comme dans le cours.
- Écris une fonction
existe_chemin(graphe, depart, arrivee)qui renvoieTrues'il existe un chemin dedepartàarrivee, etFalsesinon. Tu peux choisir le parcours de ton choix. - Pourquoi ta fonction se termine-t-elle même si le graphe contient un cycle ?
- Sur le graphe de l'exercice 2, que renvoient
existe_chemin(g, 3, 5)etexiste_chemin(g, 3, 6)?
Indice 1
Un sommet est accessible depuis depart s'il est marqué à la fin d'un parcours lancé depuis depart.
Indice 2
Tu peux t'arrêter dès que tu rencontres arrivee.
Voir la correction pas à pas
On choisit un parcours en largeur avec une file et un ensemble
vus, en partant dedepart.On écrit :
def existe_chemin(graphe, depart, arrivee):puisvus = {depart}etfile = deque([depart]).Dans la boucle
while file, on retiresen tête ; sis == arrivee, on renvoieTrue.Pour chaque voisin
tdesnon présent dansvus, on l'ajoute àvuset à la file.Si la boucle se termine sans avoir rencontré
arrivee, on renvoieFalse.Terminaison : chaque sommet entre au plus une fois dans la file grâce à
vus, et le graphe a un nombre fini de sommets, donc la file finit par se vider, cycle ou non.Résultats :
existe_chemin(g, 3, 5)renvoieTrue(3, 4, 5) etexiste_chemin(g, 3, 6)renvoieFalse, car6n'est pas dans la composante de3.
Une fonction d'accessibilité est un parcours dont on interroge le marquage. La preuve de terminaison repose toujours sur le même argument : un ensemble fini de sommets et un marquage qui empêche de les ajouter deux fois.
Quiz
8 questions · correction immédiate · ton score reste sur ton appareil.
-
Le parcours en largeur sort le sommet de tête de la file et range à la fin ses voisins non encore explorés,4 ce qui explore les sommets par distance croissante. La pile est la tentation classique : c'est la structure du parcours en profondeur, et échanger l'une contre l'autre transforme un parcours en l'autre.4
-
Depuis
A, on s'enfonce parB, puisD(cul-de-sac), retour àB, puisE,F, etCavantG. La réponse « A, B, C, D, E, F, G » est l'ordre du parcours en largeur : c'est l'erreur tentante, qui confond les deux parcours. -
On visite
A, puis ses voisinsBetC, puis les voisins non marqués deB(D,E), puis ceux deC(F), enfinG. L'ordre « A, B, D, E, F, C, G » est celui du parcours en profondeur : il enfonce la branche deBavant de revenir àC. -
Gest découvert en dernier par le parcours en largeur, via le chemin A, C, F, G qui traverse 3 arêtes. Répondre 4 revient à compter les sommets du chemin au lieu des arêtes ; aucun chemin plus court n'existe, carGn'est voisin que deF, lui-même à distance 2. -
C'est vrai : les sommets sont explorés par distance croissante à la source, ce qui donne les plus courts chemins dans un graphe non pondéré, orienté ou non.4 Penser le contraire vient souvent de la confusion avec le parcours en profondeur, qui ne garantit aucune distance minimale.
-
Utiliser une pile à la place de la file fait passer de l'algorithme en largeur à l'algorithme en profondeur.4 Supprimer le marquage n'est pas la bonne piste : cela rend les deux parcours incorrects sur un graphe avec cycle. Inverser l'ordre des voisins change l'ordre de visite sans changer la nature du parcours.
-
C'est faux : le parcours ne trouve que les sommets accessibles depuis
s, c'est-à-dire ceux qui sont reliés àspar un chemin.5 Les sommets d'une autre composante connexe restent non marqués. Pour couvrir tout le graphe, il faut relancer un parcours depuis un sommet non marqué.
Les questions qu'on se pose
Faut-il toujours marquer les sommets visités ?
Quand préférer le parcours en largeur au parcours en profondeur ?
Choisis la largeur quand la question porte sur une distance ou un plus court chemin en nombre d'arêtes, car les sommets y sont explorés par distance croissante à la source.4 Choisis la profondeur quand tu veux simplement savoir si un chemin existe ou explorer à fond, notamment en récursif, car son écriture est très naturelle.5 Pour l'accessibilité et les composantes connexes, les deux conviennent.
Pourquoi mon parcours en profondeur donne-t-il un ordre différent de celui du corrigé ?
L'ordre de visite dépend de l'ordre dans lequel les voisins sont examinés. Si le corrigé suit l'ordre alphabétique et que tu suis un autre ordre, tu obtiens un parcours valide mais différent. Relis l'énoncé pour repérer la consigne, et vérifie aussi que tu reviens bien au dernier sommet qui offrait encore un chemin, et pas au premier.5
Quelle est la différence entre la version récursive et la version avec pile du parcours en profondeur ?
Elles visitent les sommets dans le même ordre si tu empiles les voisins en ordre inverse. La version récursive laisse Python gérer la pile des appels ; la version itérative gère la pile à la main. Le parcours en profondeur se décrit naturellement de manière récursive,5 mais l'itératif évite l'erreur de dépassement de profondeur sur de très grands graphes.
Qu'est-ce qui tombe au bac sur ce chapitre ?
On te demande surtout de dérouler un parcours à la main sur un petit graphe (ordre de visite, contenu de la file ou de la pile), de compléter ou de corriger un programme Python, et d'utiliser un parcours pour répondre à une question : un chemin existe-t-il, quelle est la distance, combien de composantes connexes ? Entraîne-toi à faire le tableau « sommet traité, file ou pile, sommets marqués ».
Sources
Programme visé : Numérique et sciences informatiques - spécialité Terminale - Algorithmique et graphes · Ministère de l'Éducation nationale
- Numérique et sciences informatiques - spécialité Terminale - Algorithmique et graphes, Ministère de l'Éducation nationale. Consulté le 7 novembre 2026.
- Ressources accompagnement NSI - Récursivité et structures de données, Éduscol. Consulté le 7 novembre 2026.
- Algorithmique des graphes - Cours avancé, CNRS - LIRIS. Consulté le 7 novembre 2026.
- Algorithme de parcours en largeur, Wikipédia. Consulté le 7 novembre 2026.
- Algorithme de parcours en profondeur, Wikipédia. Consulté le 7 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.