Prepa Help
Prepa Help › Cours › Informatique, 2e année

Graphes : représentations en Python, parcours en largeur et en profondeur, exercices corrigés de prépa

Graphes orientés et non orientés, pondérés, vocabulaire (sommets, arêtes, degré, chemin, cycle, connexité), représentations par matrice d'adjacence et par listes d'adjacence en Python, coûts en mémoire et en temps, parcours en largeur avec une file et en profondeur récursif ou avec une pile, composantes connexes, détection de cycle, plus courte distance en nombre d'arêtes, complexités.

Les nombres sont ceux du chapitre complet ; chaque filière voit la partie qui correspond à son programme.

Un graphe G=(S,A)G = (S, A) est formé de sommets et d'arêtes, paires de sommets, s'il est non orienté, ou d'arcs, couples de sommets, s'il est orienté ; il décrit un réseau de pistes, de routes ou de cases d'une image. Le chapitre traite la section « Introduction à la théorie des graphes » du programme d'informatique de deuxième année en MP, PSI et TSI au Maroc. Il fixe le vocabulaire (degré, chaîne et chemin, cycle et circuit, connexité, composantes connexes, graphe pondéré), puis représente un graphe en Python par une matrice d'adjacence ou par des listes d'adjacence, rangées dans une liste ou dans un dictionnaire, et compare leurs coûts : test d'une arête en O(1)O(1) mais mémoire en O(n2)O(n^2) pour la matrice, mémoire en O(n+p)O(n + p) pour les listes. Il écrit le parcours en largeur avec une file deque, qui donne les distances en nombre d'arêtes et un plus court chemin, et le parcours en profondeur, récursif ou avec une pile, tous deux en O(n+p)O(n + p) avec des listes d'adjacence et en O(n2)O(n^2) avec une matrice. Il les applique à l'accessibilité, à la connexité, aux composantes connexes, à la détection d'un cycle ou d'un circuit et aux zones d'une grille. Les problèmes reprennent les sujets d'informatique du CNC 2019, le réseau routier en PSI et la grille binaire en MP, et un sujet X-ENS 2026 sur la détection de cycles.

Ce que tu sauras faire

Un réseau de pistes entre des ksour, de routes entre des villes ou de cases dans une image se décrit par des points et des liens. On veut savoir d'où l'on peut aller où, par combien de liens au moins, si le réseau est d'un seul tenant, s'il contient un circuit. Un graphe est l'objet qui répond à ces questions ; deux parcours, en largeur et en profondeur, suffisent à la plupart d'entre elles.

L'essentiel : Coûts selon la représentation Extrait gratuit

Un extrait de la fiche « L'essentiel » du chapitre. Les démonstrations sont dans le cours détaillé.

opération matrice listes d'adjacence
tester l'arête {i,j}\{i, j\} O(1)O(1) O(d(i))O(d(i))
voisins de ss O(n)O(n) O(d(s))O(d(s))
degré O(n)O(n) O(1)O(1)
ajouter un sommet O(n2)O(n^2) O(1)O(1)
mémoire O(n2)O(n^2) O(n+p)O(n + p)
parcours complet O(n2)O(n^2) O(n+p)O(n + p)

Une méthode du chapitre Extrait gratuit

Un exercice corrigé Extrait gratuit

Dans le chapitre complet

Le cours détaillé, toute la fiche « L'essentiel », 17 méthodes, 21 pièges corrigés, la carte mentale, 34 exercices corrigés, 3 problèmes de concours, les fiches à mémoriser et l'assistant qui répond à tes questions. Les trois premiers chapitres de chaque matière sont offerts avec un compte d’essai gratuit.

Ouvrir l'essai gratuitVoir les offres

Plan du cours

Les méthodes du chapitre

Chaque méthode est une fiche : quand l'utiliser, le rappel de cours, les étapes, la rédaction attendue sur la copie, un exemple traité, les erreurs à éviter.

  1. Modéliser une situation par un graphe
  2. Employer le vocabulaire : degrés, chaînes, cycles, connexité
  3. Écrire et lire la matrice d'adjacence
  4. Écrire les listes d'adjacence, dans une liste ou un dictionnaire
  5. Passer d'une représentation à l'autre
  6. Représenter un graphe pondéré
  7. Écrire les fonctions élémentaires : test, voisins, degré, ajout, suppression
  8. Choisir une représentation et justifier par les coûts
  9. Écrire un parcours en largeur avec une deque et dérouler sa trace
  10. Calculer les distances en nombre d'arêtes et reconstruire un plus court chemin
  11. Écrire un parcours en profondeur, récursif ou avec une pile
  12. Justifier terminaison, correction et complexité d'un parcours
  13. Tester la connexité, compter et lister les composantes connexes
  14. Détecter un cycle ou un circuit
  15. Traiter une grille ou un ensemble d'états comme un graphe sans le construire
  16. Lire un sujet de graphes : représentation, conventions, fonctions fournies
  17. Compter les chemins de longueur mm par les puissances de la matrice d'adjacence

Les exercices corrigés

Chaque exercice a ses indications, sa correction rédigée et ce qu'il faut en retenir.

Application directe (13)

Entraînement (15)

Approfondissement (6)

Les problèmes de concours

Des extraits de sujets réels, corrigés en entier, avec la durée conseillée et les méthodes mobilisées.

Questions fréquentes

Matrice d'adjacence ou listes d'adjacence : laquelle choisir ?

Pour nn sommets numérotés de 0 à n−1n - 1, la matrice s'écrit M = [[0] * n for i in range(n)], puis M[u][v] = 1 pour chaque arête ; les listes s'écrivent G = [[] for i in range(n)], puis G[u].append(v), et une arête d'un graphe non orienté y est rangée deux fois. La matrice teste une arête en O(1)O(1), mais occupe n2n^2 cases quel que soit le nombre d'arêtes et demande O(n)O(n) pour trouver les voisins d'un sommet. Les listes occupent O(n+p)O(n + p), pour pp arêtes, donnent les voisins aussitôt, mais testent une arête en O(d(i))O(d(i)). Pour 1 000 sommets de quatre voisins chacun, la matrice a un million de cases, les listes 4 000 éléments. La matrice convient aux petits graphes et aux graphes denses ; les listes d'adjacence conviennent aux graphes peu denses, comme les réseaux réels, et aux parcours.

Comment écrire un parcours en largeur en Python ?

Avec une file : from collections import deque, F = deque(), F.append(s) et vu[s] = True pour le départ. Tant que la file n'est pas vide, on retire u = F.popleft(), on le traite, puis on examine ses voisins dans l'ordre de la liste : chaque voisin non marqué est marqué aussitôt et enfilé. On marque un sommet au moment où on l'enfile, pour qu'il n'entre qu'une fois dans la file. On n'écrit jamais F.pop(0) sur une liste : ce retrait décale tous les éléments et coûte O(k)O(k) pour une file de kk éléments ; mesuré sur 160 000 éléments, vider la file ainsi est environ 300 fois plus lent qu'avec popleft, en temps constant.

Comment trouver un plus court chemin avec un parcours en largeur ?

On initialise dist à −1-1 partout sauf dist[s] = 0, et pred à −1-1. Pendant le parcours en largeur, quand on découvre vv depuis uu, on pose dist[v] = dist[u] + 1 et pred[v] = u. Les sommets sortent de la file par distances croissantes : à la fin, dist[v] est la distance de ss à vv en nombre d'arêtes. Pour obtenir un plus court chemin jusqu'à tt, on remonte pred depuis tt jusqu'à ss, puis on retourne la liste ; si dist[t] vaut −1-1, tt n'est pas accessible. Le coût est celui du parcours, O(n+p)O(n + p). Ce chemin est le plus court en nombre d'arêtes, pas en kilomètres : sur les pistes du cours, il rend un itinéraire de 45 km alors qu'un autre, avec le même nombre de pistes, en fait 37. Les longueurs relèvent d'autres algorithmes, au chapitre suivant.

Parcours en profondeur : version récursive ou avec une pile ?

La version récursive visite un sommet, le marque, puis s'appelle sur chacun de ses voisins non vus. Elle empile un appel par sommet de la chaîne en cours, et Python limite par défaut la pile à 1 000 appels en attente : sur une chaîne de 2 000 sommets parcourue depuis une extrémité, elle s'arrête sur une erreur RecursionError. La version avec une pile explicite dépile un sommet, le marque et le visite s'il n'est pas encore vu, puis empile ses voisins non vus ; un sommet peut alors être empilé plusieurs fois, et la pile contenir jusqu'à O(p)O(p) éléments. Les deux sont des parcours en profondeur, mais pas dans le même ordre : la pile prend d'abord le dernier voisin de la liste. Empiler les voisins en ordre inverse redonne l'ordre de la version récursive. Pour un très grand graphe, on préfère la version avec une pile.

Quelle est la complexité d'un parcours en largeur ou en profondeur ?

Avec des listes d'adjacence, O(n+p)O(n + p) : chaque sommet est enfilé ou visité au plus une fois, puisqu'on le marque, et chaque liste d'adjacence est parcourue une fois ; la somme de leurs longueurs vaut 2p2p dans un graphe non orienté, puisque la somme des degrés vaut 2p2p. Avec une matrice, trouver les voisins d'un sommet lit une ligne entière, en O(n)O(n) : le parcours coûte O(n2)O(n^2), même si le graphe a peu d'arêtes. Le meilleur cas, un départ sans voisin, est en Θ(n)\Theta(n), pour la création de la liste vu ; le pire cas, tous les sommets accessibles, en Θ(n+p)\Theta(n + p) avec des listes et en Θ(n2)\Theta(n^2) avec une matrice. Pour 4 000 sommets et environ 8 000 arêtes, le parcours en largeur prend environ 5 ms avec des listes et 2 s avec une matrice.

Comment tester la connexité d'un graphe ou y détecter un cycle ?

Un graphe non orienté est connexe si un parcours depuis un sommet quelconque atteint les nn sommets. Pour les composantes connexes, on lance un parcours depuis chaque sommet non encore atteint et l'on donne le même numéro à tous les sommets qu'il atteint : O(n+p)O(n + p) en tout. Pour un cycle dans un graphe non orienté, on retient le père de chaque sommet découvert : un voisin déjà marqué qui n'est pas le père révèle un cycle ; l'arête qui ramène au père, elle, n'en fait pas. Dans un graphe orienté, rencontrer un sommet déjà vu ne prouve rien, car deux chemins peuvent arriver au même sommet : on fait un parcours en profondeur à trois états, non vu, en cours, terminé, et un arc vers un sommet en cours ferme un circuit. Ces tests coûtent O(n+p)O(n + p) avec des listes d'adjacence.

Comment y accéder

Ce chapitre fait partie de l'accès complet. Les trois premiers chapitres de chaque matière (deux par bloc en économie et droit, en management et gestion) sont offerts avec un compte d'essai gratuit. Créer un compte d'essai ou se connecter. Pour l'accès complet et les tarifs, vois les offres.

Toute ta prépa au même endroit

Pour chaque chapitre : le cours, l'essentiel, les méthodes, les pièges, les exercices corrigés, les problèmes de concours, et un assistant qui répond à tes questions. Programmes du Maroc et de France. Avec la plateforme vidéo YOUNESS SCHOOL offerte, dès 600 DH (60 $) par mois, sans engagement.

Prépas scientifiques : voir l'offrePrépas ECS et ECT : voir l'offreTu hésites encore ? Essaie gratuitement Prepa Help.

← Métaheuristiques : le recuit simulé