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

Plus courts chemins et coloration : Dijkstra, A*, Floyd-Warshall, exercices corrigés de prépa

Graphes pondérés, plus court chemin à origine unique par l'algorithme de Dijkstra avec une file de priorité, reconstruction du chemin par les prédécesseurs, algorithme A* et heuristique consistante, plus courts chemins entre tous les couples par Floyd-Warshall, coloration gloutonne d'un graphe et applications, complexités.

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

Dans un graphe pondéré, la distance de ss à tt est la plus petite somme des poids d'un chemin de ss à tt. Le chapitre traite les lignes « Recherche d'un plus court chemin dans un graphe pondéré positivement » et « Applications » du programme d'informatique de deuxième année en MP, PSI et TSI au Maroc. Il déroule l'algorithme de Dijkstra dans le tableau des distances, l'écrit en Python, d'abord en O(n2)O(n^2) avec une recherche du minimum, puis en O((n+p)log⁡n)O((n + p) \log n) avec un tas, reconstruit les chemins par les prédécesseurs et montre pourquoi les poids doivent être positifs ou nuls. Il présente A* comme une variante heuristique de Dijkstra, avec une heuristique consistante, calcule toutes les distances par l'algorithme de Floyd-Warshall en Θ(n3)\Theta(n^3) et colore un graphe par la coloration gloutonne, Welsh-Powell et DSATUR, en encadrant le nombre chromatique. Les problèmes reprennent des sujets d'informatique du CCINP 2025 (une randonnée), du CCINP 2024 en filière TSI (la coloration d'une carte de pays) et du concours X-ENS 2023 (deux textes comparés par un plus court chemin).

Ce que tu sauras faire

Quand les pistes ont des longueurs, le moins de pistes n'est plus le moins de kilomètres. On veut l'itinéraire le plus court depuis la coopérative, vers un seul ksar ou vers tous, puis toutes les distances d'un coup, pour choisir où regrouper les réserves ; on veut enfin partager des jours ou des créneaux sans conflit entre voisins. Quatre algorithmes répondent à ces questions : Dijkstra, A*, Floyd-Warshall et la coloration gloutonne.

L'essentiel : Dijkstra Extrait gratuit

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

À retenir Principe

À chaque étape, fixer le sommet non fixé de plus petite distance provisoire (le plus petit numéro à égalité), puis relâcher les arcs qui en partent. Exact quand les poids sont positifs ou nuls ; un seul poids négatif peut le tromper (0 → 1 : 2, 0 → 2 : 3, 2 → 1 : −2 donne 2 au lieu de 1). Invariant : la valeur d'un sommet fixé est sa distance.

def dijkstra(GP, s):
    n = len(GP)
    dist = [INF] * n
    pred = [-1] * n
    fixe = [False] * n
    dist[s] = 0
    for etape in range(n):
        u = -1
        m = INF
        for v in range(n):
            if not fixe[v] and dist[v] < m:
                u = v
                m = dist[v]
        if u == -1:
            break
        fixe[u] = True
        for (v, w) in GP[u]:
            if not fixe[v] and dist[u] + w < dist[v]:
                dist[v] = dist[u] + w
                pred[v] = u
    return dist, pred

Chemin : remonter de t à s par pred, puis retourner la liste (chemin_pred) ; None si pred[t] == -1 et t != s.

Avec un tas (tas-max du chapitre 3) : ranger (-dist[v], -v) à chaque amélioration ; à l'extraction, ignorer un sommet déjà fixé (entrée périmée) ; le tas reçoit au plus un couple par arc examiné.

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, 23 pièges corrigés, la carte mentale, 35 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 un problème de plus court chemin
  2. Dérouler Dijkstra à la main dans le tableau des distances
  3. Écrire Dijkstra naïf sur listes de couples ou sur matrice des poids
  4. Reconstruire un plus court chemin par les prédécesseurs
  5. Justifier Dijkstra : terminaison, invariant, rôle de la positivité
  6. Écrire Dijkstra avec une file de priorité et dérouler le contenu du tas
  7. Calculer la complexité d'un algorithme de plus court chemin et choisir la version
  8. Réfuter un algorithme de chemin par un contre-exemple
  9. Écrire A* à partir de Dijkstra et compter les sommets fixés
  10. Choisir une heuristique et prouver qu'elle est admissible ou consistante
  11. Dérouler Floyd-Warshall à la main
  12. Écrire floyd_warshall, reconstruire un chemin et l'appliquer
  13. Colorer par le glouton dans un ordre donné et vérifier une coloration
  14. Améliorer l'ordre : Welsh-Powell, DSATUR
  15. Encadrer le nombre chromatique et conclure à l'optimalité
  16. Modéliser des conflits par une coloration
  17. Choisir l'algorithme et lire un sujet de plus courts chemins ou de coloration

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 (16)

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

Comment fonctionne l'algorithme de Dijkstra ?

Dijkstra calcule les distances d'une source ss à tous les sommets d'un graphe dont les poids sont positifs ou nuls. On garde pour chaque sommet une distance provisoire dist[v], 0 pour la source et INF = float('inf') ailleurs, et un prédécesseur pred[v]. À chaque étape, on fixe le sommet non fixé de plus petite distance provisoire, puis on relâche les arcs qui en partent : si dist[u] + w < dist[v], on remplace dist[v] par dist[u] + w et pred[v] par u. Ce choix est sûr parce que tout autre chemin vers ce sommet passe par un sommet non fixé au moins aussi éloigné, et que la suite du chemin a une longueur positive ou nulle. Avec une recherche du minimum parmi tous les sommets, le coût est O(n2)O(n^2). Avec un tas, où l'on ajoute un couple à chaque amélioration et où l'on ignore à l'extraction un sommet déjà fixé, il descend à O((n+p)log⁡n)O((n + p) \log n), bien meilleur pour un graphe peu dense.

Pourquoi Dijkstra ne marche-t-il pas avec des poids négatifs ?

Dijkstra fixe un sommet dès qu'il est le plus proche des sommets non fixés, en supposant qu'aucun chemin plus long au départ ne pourra le rattraper. Un arc de poids négatif peut le rattraper. Avec les arcs 0→10 \to 1 de poids 2, 0→20 \to 2 de poids 3 et 2→12 \to 1 de poids −2-2, Dijkstra fixe le sommet 1 à la distance 2 avant d'examiner l'arc 2→12 \to 1 ; or le chemin 0,2,10, 2, 1 a une longueur 3+(−2)=13 + (-2) = 1. Le programme rend 2 sans rien signaler. Ajouter la même constante à tous les poids ne répare rien : un chemin de kk arcs gagne kk fois la constante, et l'ordre des longueurs change. Sur cet exemple, en ajoutant 2, le chemin rendu devient l'arc direct. Le programme ne demande Dijkstra que pour des graphes pondérés positivement ; l'algorithme de Floyd-Warshall accepte des poids négatifs, pourvu qu'il n'y ait aucun cycle de poids total négatif.

Qu'est-ce que l'algorithme A* et une heuristique admissible ?

A* cherche un plus court chemin vers une seule cible tt. Il fait comme Dijkstra, mais fixe à chaque étape le sommet qui minimise g(v)+h(v)g(v) + h(v), où g(v)g(v) est la distance provisoire depuis la source et h(v)h(v) une estimation de la distance qui reste jusqu'à tt, et il s'arrête quand tt est fixé. Avec h=0h = 0, c'est Dijkstra. L'heuristique est admissible si elle ne surestime jamais, h(v)≤d(v,t)h(v) \le d(v, t) ; elle est consistante si h(u)≤w(u,v)+h(v)h(u) \le w(u, v) + h(v) pour tout arc, avec h(t)=0h(t) = 0, ce qui entraîne l'admissibilité. Avec une heuristique consistante, A* rend la distance (résultat admis), en fixant souvent bien moins de sommets : sur le réseau de pistes du cours, 4 ksour au lieu de 9. Sur une grille à quatre directions de pas 1, la distance de Manhattan est consistante. Une heuristique qui surestime peut faire rendre un chemin trop long.

Comment fonctionne l'algorithme de Floyd-Warshall ?

Floyd-Warshall calcule les distances entre tous les couples de sommets, sur la matrice des poids, avec INF sans arc et 0 sur la diagonale. On note dk(i,j)d_k(i, j) la plus courte longueur d'un chemin de ii à jj dont les sommets intermédiaires sont parmi 0,…,k−10, \ldots, k - 1. Un plus court chemin qui a le droit de passer par kk n'y passe pas, ou y passe une fois, d'où la récurrence dk+1(i,j)=min⁡(dk(i,j),dk(i,k)+dk(k,j))d_{k+1}(i, j) = \min(d_k(i, j), d_k(i, k) + d_k(k, j)), valable sans cycle de poids négatif. On ne garde qu'une matrice, mise à jour sur place, et la boucle sur le sommet intermédiaire kk est la plus extérieure. Une matrice des successeurs, mise à jour par S[i][j] = S[i][k], permet de reconstruire les chemins. Le coût est Θ(n3)\Theta(n^3) en temps et O(n2)O(n^2) en mémoire. Une case négative sur la diagonale révèle un cycle de poids négatif. La matrice donne aussi l'excentricité de chaque sommet et le centre du graphe.

Comment colorer un graphe par un algorithme glouton ?

Une coloration donne à chaque sommet une couleur, de sorte que deux voisins aient des couleurs différentes ; le nombre chromatique χ(G)\chi(G) est le plus petit nombre de couleurs possible. Le glouton prend les sommets dans un ordre donné et donne à chacun la plus petite couleur qu'aucun de ses voisins déjà colorés n'utilise ; il coûte O(n+p)O(n + p) et utilise au plus Δ+1\Delta + 1 couleurs, où Δ\Delta est le plus grand degré. Le résultat dépend de l'ordre : sur la couronne à huit sommets, il utilise 4 couleurs dans l'ordre des numéros, alors que 2 suffisent. Welsh-Powell prend les sommets par degrés décroissants ; DSATUR choisit à chaque étape le sommet dont les voisins colorés portent le plus de couleurs différentes. Aucun ne garantit χ(G)\chi(G). Une clique, ensemble de sommets deux à deux voisins, minore χ(G)\chi(G) : une coloration à kk couleurs et une clique de kk sommets prouvent que la coloration est optimale.

Dijkstra, A*, Floyd-Warshall : quel algorithme choisir ?

Tout dépend de la question et du signe des poids. Si tous les poids sont égaux, le parcours en largeur donne les distances en nombre d'arêtes en O(n+p)O(n + p). Pour les distances depuis une source avec des poids positifs ou nuls, on prend Dijkstra : la version naïve, en O(n2)O(n^2), convient à un graphe dense ; la version avec un tas, en O((n+p)log⁡n)O((n + p) \log n), à un graphe peu dense comme un réseau de routes. Pour une seule cible et une bonne estimation de la distance restante, A* fixe en général bien moins de sommets. Pour les distances entre tous les couples, ou avec des poids négatifs sans cycle de poids négatif, on prend Floyd-Warshall, en Θ(n3)\Theta(n^3), au code très court. Pour partager une ressource entre des sommets voisins, comme des jours de livraison, des créneaux d'examen ou des fréquences, on cherche une coloration, puis une clique pour savoir si l'on peut faire mieux. Sur la copie, on justifie ce choix en une phrase.

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.

← Graphes : représentations et parcours · Apprentissage automatique : k plus proches voisins et k-moyennes →