Un graphe est une structure aussi simple que puissante : des points (sommets) reliés par des traits (arêtes). Inventée par Euler en 1736 pour résoudre une énigme de promenade à Königsberg, la théorie des graphes est aujourd’hui partout — du GPS qui calcule ton itinéraire au moteur de recommandation de Netflix, en passant par les neurones d’un réseau profond.

Programme

Définitions, types de graphes, représentations, parcours (BFS, DFS), plus courts chemins (Dijkstra, Bellman-Ford), arbres couvrants minimaux, coloration, planarité. Programme typique de NSI/option informatique en prépa.

1. Définitions de base§

1.1 Graphe non orienté§

Définition — Graphe

Un graphe G=(V,E)G = (V, E) est la donnée d’un ensemble fini de sommets VV (vertices) et d’un ensemble d’arêtes Eu,v:u,vVE \subset {{u,v} : u,v \in V}.

  • V=n|V| = n : ordre du graphe
  • E=m|E| = m : taille du graphe
flowchart LR
    A --- B
    B --- C
    A --- C
    C --- D
    D --- E

1.2 Vocabulaire§

TermeDéfinition
Voisinvv est voisin de uu s’il existe une arête u,v{u,v}
Degré deg(v)\deg(v)Nombre d’arêtes incidentes à vv
CheminSuite d’arêtes consécutives
CycleChemin qui revient au sommet de départ
ConnexeTout sommet est accessible depuis tout autre
Composante connexeSous-graphe connexe maximal
Lemme des poignées de main (Euler, 1736)

Dans tout graphe non orienté :

vVdeg(v)=2E\sum_{v \in V} \deg(v) = 2|E|

Corollaire : le nombre de sommets de degré impair est toujours pair.

1.3 Graphes orientés (digraphes)§

Les arêtes deviennent des arcs (u,v)(u, v) avec un sens. On distingue alors :

2. Familles importantes§

FamilleCaractéristiqueExemples d’usage
Complet KnK_ntoutes les paires de sommets reliées(n2)\binom{n}{2} arêtes
BipartiVV partitionné en ABA \cup B, arêtes entre AA et BB uniquementAffectations, mariages stables
Arbreconnexe et sans cyclen1n-1 arêtes pour nn sommets
Forêtacyclique (union d’arbres)Structures hiérarchiques
Planairedessinable sans croisement d’arêtesCircuits imprimés, cartes
DAG (orienté acyclique)pas de cycleDépendances de tâches, généalogie
Pondéréarêtes munies d’un poidsRoutage, distances
Théorème d’Euler pour les arbres

Un graphe à nn sommets est un arbre si et seulement si il est connexe et possède exactement n1n-1 arêtes.

3. Représentations en machine§

ReprésentationEspaceTest arête existanteLister voisinsQuand utiliser
Matrice d’adjacenceO(n2)O(n^2)O(1)O(1)O(n)O(n)Graphes denses, nn petit
Liste d’adjacenceO(n+m)O(n+m)O(degv)O(\deg v)O(degv)O(\deg v)Graphes creux (cas le plus fréquent)
# Liste d'adjacence en Python
graphe = {
    'A': ['B', 'C'],
    'B': ['A', 'C'],
    'C': ['A', 'B', 'D'],
    'D': ['C', 'E'],
    'E': ['D']
}

4. Parcours de graphes§

Explore le graphe couche par couche depuis un sommet de départ. Utilise une file (FIFO).

from collections import deque

def bfs(graphe, depart):
    visite = {depart}
    file = deque([depart])
    ordre = []
    while file:
        u = file.popleft()
        ordre.append(u)
        for v in graphe[u]:
            if v not in visite:
                visite.add(v)
                file.append(v)
    return ordre

Complexité : O(n+m)O(n + m). Application principale : plus court chemin en nombre d’arêtes (graphe non pondéré).

Plonge le plus loin possible avant de revenir. Utilise une pile (ou la récursion).

def dfs(graphe, depart, visite=None):
    if visite is None:
        visite = set()
    visite.add(depart)
    for v in graphe[depart]:
        if v not in visite:
            dfs(graphe, v, visite)
    return visite

Complexité : O(n+m)O(n + m). Applications :

flowchart TB
    subgraph BFS["BFS — couche par couche"]
        A1[A]
        B1[B] --- A1
        C1[C] --- A1
        D1[D] --- B1
        E1[E] --- C1
    end
    subgraph DFS["DFS — plonge en profondeur"]
        A2[A] --> B2[B] --> D2[D]
        D2 --> E2[E]
        A2 --> C2[C]
    end

5. Plus courts chemins§

5.1 Dijkstra (1956)§

Plus court chemin depuis une source dans un graphe à poids positifs.

Algorithme de Dijkstra
  1. Initialiser d[s]=0d[s] = 0 et d[v]=+d[v] = +\infty pour les autres sommets
  2. À chaque étape, sélectionner le sommet uu non visité de distance minimale
  3. Relâcher ses voisins : si d[u]+w(u,v)<d[v]d[u] + w(u,v) < d[v], mettre à jour d[v]d[v]
  4. Marquer uu comme visité ; recommencer

Complexité : O((n+m)logn)O((n+m) \log n) avec un tas de priorité. Utilisé par : Google Maps, OSPF (routage Internet), jeux vidéo (pathfinding).

5.2 Bellman-Ford§

Plus lent (O(nm)O(nm)) mais accepte les poids négatifs et détecte les cycles négatifs. Utilisé en protocole de routage RIP.

5.3 Floyd-Warshall§

Calcule tous les plus courts chemins entre toutes les paires en O(n3)O(n^3). Programmation dynamique élégante : si d[i][j][k]d[i][j][k] est la distance de ii à jj via uniquement les sommets 1,,k{1, \dots, k},

d[i][j][k]=min(d[i][j][k1],;d[i][k][k1]+d[k][j][k1])d[i][j][k] = \min(d[i][j][k-1],; d[i][k][k-1] + d[k][j][k-1])

5.4 A* — guidé par heuristique§

Comme Dijkstra mais avec une heuristique h(v)h(v) qui estime la distance restante. Si hh est admissible (n’overestime jamais), A* est optimal. Standard en IA de jeux vidéo, robotique.

6. Arbres couvrants minimaux§

Sur un graphe pondéré connexe, un arbre couvrant minimal (ACM) connecte tous les sommets en minimisant la somme des poids.

AlgorithmeApprocheComplexité
KruskalTrier les arêtes, ajouter si elle ne crée pas de cycle (union-find)O(mlogm)O(m \log m)
PrimFaire croître l’arbre depuis un sommet, comme DijkstraO((n+m)logn)O((n+m) \log n)

Application : conception de réseaux (électriques, télécoms) à coût minimal, clustering.

7. Coloration§

Définition

Une kk-coloration d’un graphe est une assignation d’une couleur parmi kk à chaque sommet, telle que deux voisins n’aient jamais la même couleur. Le nombre chromatique χ(G)\chi(G) est le plus petit kk possible.

Applications :

Théorème des quatre couleurs (Appel & Haken, 1976)

Toute carte planaire peut être coloriée avec au plus 4 couleurs. Première grande démonstration assistée par ordinateur — démontrant 1 936 configurations à la main aurait été infaisable.

8. Problèmes célèbres et NP-complétude§

ProblèmeEn françaisComplexité connue
Plus court cheminDijkstraPP
Cycle eulérienpasser par toutes les arêtes une foisPP (Euler : possible ssi tous sommets de degré pair, connexe)
Cycle hamiltonienpasser par tous les sommets une foisNP-complet
Voyageur de commerce (TSP)tournée minimaleNP-difficile
Coloration optimaleχ(G)=k\chi(G) = k ?NP-complet pour k3k \geq 3
Couplage maximumtrouver un couplage de taille maxPP (algorithme d’Edmonds)
Flot maximumFord-FulkersonPP
Clique maxsous-graphe complet de taille maxNP-complet
Königsberg et Euler

Le problème des sept ponts de Königsberg : peut-on traverser chaque pont exactement une fois ? Euler répond en 1736 : non, car un cycle eulérien exige que tous les sommets soient de degré pair. Cette résolution est considérée comme l’acte de naissance de la théorie des graphes.

9. Planarité et formule d’Euler§

Formule d’Euler pour les polyèdres / graphes planaires (1750)

Pour tout graphe planaire connexe à nn sommets, mm arêtes, ff faces (y compris la face externe) :

nm+f=2n - m + f = 2

Conséquence remarquable : un graphe planaire à n3n \geq 3 sommets a au plus 3n63n - 6 arêtes. Donc K5K_5 (5 sommets, 10 arêtes > 9) et K3,3K_{3,3} (6 sommets, 9 arêtes mais structure bipartie) ne sont pas planaires — c’est le théorème de Kuratowski.

10. Applications modernes§

DomaineUsage
PageRank (Google)Vecteur propre d’une matrice stochastique sur le graphe des liens hypertextes
Réseaux sociauxDétection de communautés, influence, propagation virale
GPS, navigationA*, Dijkstra sur graphe routier
CompilateursAllocation de registres (coloration), dépendances entre instructions
Bio-informatiqueAssemblage de génome (graphe de De Bruijn)
Réseaux de neurones graphiques (GNN)Apprentissage sur structures non régulières
Vérification logicielleGraphes de flot de contrôle, model checking