NSI Terminale — programme officiel

Graphes : représentations et parcours : fiche de révision

Graphes orientés et non orientés, matrice et liste d'adjacence, parcours en largeur et en profondeur, détection de cycle et recherche de chemin : la fiche complète avec le code Python.

Génère ta fiche depuis TON coursFiches, flashcards et QCM générés par IA — gratuit

1Vocabulaire et représentations

Un graphe est un ensemble de sommets reliés par des arêtes (graphe non orienté) ou des arcs (graphe orienté). Deux sommets reliés sont adjacents ; le degré d'un sommet est son nombre de voisins. Un chemin est une suite de sommets consécutivement reliés ; un cycle est un chemin qui revient à son sommet de départ. Un graphe est connexe si tout couple de sommets est relié par un chemin. Les graphes modélisent les réseaux routiers, sociaux, informatiques, les dépendances entre tâches.

Deux représentations au programme. La matrice d'adjacence : un tableau n × n où M[i][j] vaut 1 (ou le poids) s'il existe une arête de i vers j, 0 sinon ; symétrique pour un graphe non orienté. Test d'adjacence en O(1), mais mémoire en O(n²) et énumération des voisins en O(n). La liste d'adjacence : un dictionnaire qui associe à chaque sommet la liste de ses voisins. Mémoire en O(n + m) avec m le nombre d'arêtes, énumération des voisins immédiate — c'est la représentation privilégiée pour les graphes peu denses.

graphe = {'A': ['B', 'C'], 'B': ['A', 'D'], 'C': ['A'], 'D': ['B']}

2Parcours en largeur (BFS) et en profondeur (DFS)

Le parcours en largeur explore les sommets par distance croissante depuis le départ : on utilise une file et un ensemble des sommets déjà vus (pour ne pas boucler sur les cycles).

def parcours_largeur(g, depart):

vus = {depart} ; file = [depart] ; ordre = []

while file:

s = file.pop(0) ; ordre.append(s)

for v in g[s]:

if v not in vus: vus.add(v) ; file.append(v)

return ordre

Le parcours en profondeur suit un chemin le plus loin possible avant de revenir en arrière. Version récursive : on marque le sommet, puis on se rappelle sur chaque voisin non vu ; version itérative : même algorithme que le BFS avec une pile à la place de la file.

def parcours_profondeur(g, s, vus=None):

if vus is None: vus = set()

vus.add(s)

for v in g[s]:

if v not in vus: parcours_profondeur(g, v, vus)

return vus

Les deux parcours visitent chaque sommet et chaque arête une fois : complexité O(n + m) avec des listes d'adjacence. Le BFS trouve le plus court chemin en nombre d'arêtes (graphe non pondéré) ; le DFS sert à détecter les cycles, à tester la connexité et à explorer un labyrinthe.

3Applications : chemin, cycle, connexité

Recherche d'un chemin entre deux sommets : un parcours (BFS ou DFS) depuis le départ ; l'arrivée est atteignable si et seulement si elle figure dans les sommets visités. Pour reconstituer le chemin, on mémorise pour chaque sommet son prédécesseur au moment de sa découverte, puis on remonte depuis l'arrivée.

Détection de cycle dans un graphe non orienté : lors d'un DFS, si l'on rencontre un voisin déjà vu qui n'est pas le sommet d'où l'on vient, il y a un cycle. Dans un graphe orienté, on distingue les sommets en cours de visite (sur la pile d'appels) : retomber sur l'un d'eux révèle un cycle.

Composantes connexes : on lance un parcours depuis un sommet non vu, on obtient une composante ; on répète tant qu'il reste des sommets non vus. Le nombre de lancements est le nombre de composantes.

Le programme ne demande pas les algorithmes de plus court chemin pondéré (Dijkstra) ni les arbres couvrants, mais des sujets peuvent les présenter avec le code fourni à analyser.

4Exercice type et pièges

Énoncé type : « À partir de la matrice d'adjacence donnée, dessiner le graphe, donner le degré de chaque sommet, puis l'ordre de visite d'un parcours en largeur depuis A en supposant les voisins traités dans l'ordre alphabétique. » Méthode : lire ligne par ligne (les 1 de la ligne i sont les voisins de i), compter les 1 par ligne pour le degré, dérouler le BFS en tenant à jour la file et l'ensemble des vus sur le brouillon.

Pièges : oublier l'ensemble des sommets vus (boucle infinie sur un cycle) ; confondre file et pile (BFS et DFS donnent des ordres différents) ; croire que le DFS trouve le plus court chemin ; dans une matrice d'un graphe orienté, lire la colonne au lieu de la ligne ; oublier que pop(0) est en O(n) — à l'écrit on le signale, à l'épreuve pratique on utilise deque.

Définitions à connaître par cœur

Graphe orienté
Graphe dont les liaisons (arcs) ont un sens : un arc de A vers B n'implique pas d'arc de B vers A.
Degré d'un sommet
Nombre de voisins du sommet (nombre d'arêtes qui lui sont incidentes).
Matrice d'adjacence
Tableau n × n dont la case (i, j) indique la présence (ou le poids) d'une arête entre les sommets i et j.
Liste d'adjacence
Représentation associant à chaque sommet la liste de ses voisins ; mémoire proportionnelle au nombre d'arêtes.
Parcours en largeur (BFS)
Exploration par distance croissante à l'aide d'une file ; donne les plus courts chemins en nombre d'arêtes.
Composante connexe
Ensemble maximal de sommets tous reliés entre eux par un chemin dans un graphe non orienté.

Quiz : teste-toi sur graphes : représentations et parcours

8 questions corrigées. Réponds avant d'ouvrir la correction !

1. Quelle représentation est la plus économe en mémoire pour un graphe peu dense ?

  • A.La matrice d'adjacence
  • B.La liste d'adjacence
  • C.Un tableau de tableaux n × n × n
  • D.Les deux sont équivalentes
Voir la réponse

Réponse : B. La liste d'adjacence

La liste d'adjacence occupe O(n + m) contre O(n²) pour la matrice, quel que soit le nombre d'arêtes.

2. Quel parcours trouve le plus court chemin en nombre d'arêtes ?

  • A.Le parcours en profondeur
  • B.Le parcours en largeur
  • C.Le parcours infixe
  • D.Aucun des deux
Voir la réponse

Réponse : B. Le parcours en largeur

Le BFS explore les sommets par distance croissante : le premier chemin trouvé vers un sommet est le plus court.

3. À quoi sert l'ensemble des sommets « vus » dans un parcours ?

  • A.À compter les arêtes
  • B.À éviter de revisiter un sommet et de boucler sur un cycle
  • C.À trier les sommets
  • D.À calculer les degrés
Voir la réponse

Réponse : B. À éviter de revisiter un sommet et de boucler sur un cycle

Sans marquage, un cycle ferait revisiter indéfiniment les mêmes sommets.

4. La matrice d'adjacence d'un graphe non orienté est nécessairement…

  • A.triangulaire
  • B.symétrique
  • C.diagonale
  • D.remplie de 1
Voir la réponse

Réponse : B. symétrique

Une arête entre i et j apparaît en M[i][j] et en M[j][i] : la matrice est symétrique.

5. Quelle structure remplace la file pour transformer un BFS en DFS itératif ?

  • A.Un dictionnaire
  • B.Une pile
  • C.Un ensemble
  • D.Un tableau trié
Voir la réponse

Réponse : B. Une pile

Avec une pile (LIFO), on explore toujours le dernier sommet découvert : c'est un parcours en profondeur.

6. Complexité d'un parcours de graphe avec listes d'adjacence (n sommets, m arêtes) :

  • A.O(n)
  • B.O(m)
  • C.O(n + m)
  • D.O(n × m)
Voir la réponse

Réponse : C. O(n + m)

Chaque sommet est traité une fois et chaque arête examinée une fois (deux fois si non orientée).

7. Comment obtenir le nombre de composantes connexes d'un graphe non orienté ?

  • A.En comptant les sommets de degré 0
  • B.En comptant les parcours nécessaires pour visiter tous les sommets
  • C.En calculant le déterminant de la matrice
  • D.En comptant les cycles
Voir la réponse

Réponse : B. En comptant les parcours nécessaires pour visiter tous les sommets

Chaque parcours lancé depuis un sommet non vu couvre exactement une composante.

8. Dans un DFS d'un graphe non orienté, un cycle est détecté quand…

  • A.on revient au sommet de départ
  • B.on rencontre un voisin déjà vu autre que le sommet d'où l'on vient
  • C.la pile est vide
  • D.un sommet a un degré supérieur à 2
Voir la réponse

Réponse : B. on rencontre un voisin déjà vu autre que le sommet d'où l'on vient

Retomber sur un sommet déjà visité par un autre chemin que l'arête d'arrivée prouve l'existence d'un cycle.

Envie de QCM générés depuis ton propre cours ?

Créer mes QCM gratuitement

Questions fréquentes

Quand choisir la matrice plutôt que la liste d'adjacence ?

Quand le graphe est dense (beaucoup d'arêtes) ou quand on teste très souvent l'adjacence de deux sommets donnés (O(1) avec la matrice). Pour un graphe peu dense ou pour énumérer des voisins, la liste d'adjacence l'emporte.

BFS ou DFS : lequel choisir ?

BFS pour le plus court chemin non pondéré et l'exploration par niveaux ; DFS pour la détection de cycles, le test de connexité, l'exploration exhaustive d'un labyrinthe ou le tri topologique.

Dijkstra est-il au programme ?

Non, l'algorithme de plus court chemin pondéré n'est pas exigible ; un sujet peut néanmoins le présenter avec du code à lire et à compléter, ce qui reste faisable avec les notions de BFS et de file de priorité.

Comment réviser les graphes efficacement ?

Dérouler à la main un BFS et un DFS sur un même petit graphe (5-6 sommets) en tenant la file ou la pile et l'ensemble des vus, puis coder les deux parcours de mémoire et les tester sur ce graphe.