Aller au contenu principal

Graphes

TAD et structures de données15 min

Nœuds, arêtes, propriétés et trois façons de les représenter.

Dans cette leçon

Quand la hiérarchie ne suffit plus

Un graphe représente des relations. Un nœud peut être relié à plusieurs autres, sans parent unique et sans ordre linéaire imposé.

Un réseau social, des villes reliées par des routes, des pages web ou des tâches qui dépendent les unes des autres ne forment pas forcément une hiérarchie. Plusieurs chemins peuvent relier les mêmes entités et un lien peut revenir vers une zone déjà rencontrée.

Liste

  • Chaque élément mène naturellement au suivant.
  • La position ou l'ordre porte le sens.

Arbre

  • Chaque nœud s'inscrit dans une hiérarchie.
  • Un chemin descend depuis une racine.

Graphe

  • Les relations peuvent se croiser et revenir.
  • Une entité peut avoir plusieurs voisins sans parent unique.

Nœuds, arêtes et chemins

TermeQuestion concrèteExemple
NœudQuelle entité est représentée ?Une ville
ArêteQuel lien unit deux entités ?Une route
VoisinQuel nœud est relié directement ?Lausanne est voisine de Genève
CheminQuelle suite d'arêtes relie le départ à l'arrivée ?Genève, Lausanne, Fribourg
CyclePeut-on suivre des liens et revenir au départ ?Une boucle de routes
ComposanteQuel groupe reste séparé du reste ?Une île sans liaison

Arbre et liste : des graphes très contraints

Une liste chaînée impose presque un seul chemin. Un arbre impose une hiérarchie sans retour vers un parent déjà traversé. Le graphe général retire ces contraintes et vous oblige à décrire précisément la nature des liens.

Quatre questions pour qualifier un graphe

Avant de choisir une représentation, qualifiez le problème. Quatre questions courtes suffisent pour le niveau attendu ici.

  1. Le sens compte-t-il ?

    Si A vers B ne signifie pas automatiquement B vers A, le graphe est orienté. Une arête dans chaque sens représente alors deux informations distinctes.
  2. Le lien porte-t-il un coût ?

    Une distance, une durée ou un prix rend le graphe pondéré. Le poids appartient à l'arête.
  3. Tout est-il relié ?

    Si chaque nœud appartient au même ensemble de relations, le graphe est connexe. Sinon, il possède plusieurs composantes. Pour un graphe orienté, répondez en ignorant le sens des flèches : exiger des trajets orientés dans les deux sens (la connexité forte) sort du niveau attendu.
  4. Peut-on revenir au départ ?

    Si une suite d'arêtes forme un chemin fermé, le graphe est cyclique. Cette question ne dit rien, à elle seule, sur la connexité.
PropriétéOuiNonCe que cela change
Sensgraphe orientéNon orientéUne flèche peut exister sans son retour.
CoûtPondéréNon pondéréL'arête stocke ou non une mesure.
EnsembleConnexeNon connexeDes morceaux peuvent rester isolés.
RetourCycliqueAcycliqueUn chemin fermé existe ou non.

Deux questions indépendantes

Connexe ne veut pas dire acyclique. Un réseau peut relier tous ses nœuds et contenir des cycles, ou relier tous ses nœuds sans aucun retour possible. Répondez séparément aux quatre questions.

Le code minimal : un nœud et ses liens

La représentation Java la plus directe place sur chaque nœud la liste de ses liens sortants. Ajouter A vers B ne crée pas automatiquement B vers A.

Node.java

Quand le lien porte sa propre donnée, remplacez la référence directe par un objet arête. Ici, weight peut représenter une distance, un coût ou une durée.

DirectedEdge.java
nœud → entitéarête → relationpoids → coût du lien

Restez minimal

Pour cette remédiation, ces deux petites classes suffisent. Vous n'avez pas besoin d'une classe Graph complète, de génériques ou d'une API industrielle pour expliquer le modèle.

Trois représentations du même graphe

Les trois représentations suivantes décrivent exactement les mêmes quatre nœuds et les mêmes quatre arêtes. Seule leur organisation en mémoire change.

representations.txt
  1. Liste d'arêtes

    Stockez chaque relation comme un tuple source, destination, poids. C'est compact à écrire et simple à charger depuis un fichier.
  2. Liste d'adjacence

    Associez chaque nœud à ses voisins sortants. Les voisins de A sont regroupés au même endroit.
  3. Matrice d'adjacence

    Réservez une ligne et une colonne par nœud. La case ligne A, colonne B dit immédiatement si A pointe vers B et porte son poids.

Même graphe, réponses différentes

Une représentation n'est pas « plus vraie » qu'une autre. Elle rend certaines questions faciles et en fait payer d'autres en mémoire ou en comparaisons.

Choisir selon l'opération utile

ReprésentationTrès pratique pourCompromis
Liste d'arêtesÉcrire, sérialiser ou relire toutes les relations.Trouver les voisins d'un nœud demande de rescanner les arêtes.
Liste d'adjacenceLire directement les voisins d'un nœud.Tester un lien précis demande de parcourir sa liste locale.
Matrice d'adjacenceTester immédiatement si A est relié à B.Elle réserve une case pour chaque paire, même sans arête.
matrice : lien A→B → 1 caseliste d'arêtes : voisins → toutes les arêtesadjacence : voisins → liste locale

Graphe peu connecté

  • La plupart des paires de nœuds n'ont aucun lien.
  • La liste d'adjacence ne stocke que les relations présentes.

Graphe très connecté

  • Beaucoup de paires possèdent une arête.
  • La place réservée par une matrice est moins gaspillée.

Réponse d'examen

  • Nommez d'abord l'opération dominante.
  • Choisissez ensuite la représentation qui la sert.
  • Annoncez enfin ce que ce choix coûte ailleurs.

Ce qu'il faut savoir, et pas davantage

Le niveau attendu s'arrête à la modélisation, aux quatre propriétés, au code minimal et au choix entre les trois représentations.

Aucun algorithme à apprendre ici

Vous devez pouvoir dessiner un petit graphe, traduire ce dessin en données et justifier une représentation. Cette leçon ne demande pas d'écrire une méthode pour explorer le réseau, calculer un chemin ou détecter un cycle.

Les pièges qui restent évaluables

  • A vers B n'implique pas B vers A dans un graphe orienté.
  • Une arête porte le poids, pas le nœud d'arrivée.
  • Connexe et cyclique répondent à deux questions différentes.
  • Une matrice stocke aussi toutes les absences de lien.

Vérifiez vos réflexes

Vérifiez vos réflexes

Une réponse par question. La correction apparaît tout de suite.

1. Dans un graphe orienté, A pointe vers B. Que pouvez-vous conclure ?
2. Où stocker la durée d'un trajet entre deux villes ?
3. Quelle représentation permet de tester un lien A vers B en lisant une seule case ?
4. Quel est le principal défaut d'une matrice pour un grand graphe peu connecté ?
5. Un graphe connexe est-il forcément acyclique ?

Continuez le parcours

Les arbres sont une porte d'entrée utile : ils montrent déjà des nœuds et des arêtes, avec beaucoup plus de contraintes. La leçon suivante quitte les structures pour demander où placer la complexité dans le code.

Centre de commandes

Rechercher une page et s'y rendre