informatique (MP2I/MPI) · Chapitre 19 · Exercice de TD
Problème — Un graphe sans circuit : les plus courts et les plus longs chemins
Parcours de graphes et plus courts chemins · niveau 3 (difficile)
Énoncé
Dans un graphe orienté acyclique pondéré, le tri topologique change tout.
- Écrire un algorithme de plus courts chemins depuis une source en , valable même avec des poids négatifs.
- Montrer qu'il calcule aussi les plus longs chemins, en changeant un seul symbole.
- Pourquoi cela ne contredit-il pas l'avertissement du chapitre chap:dynamique sur le plus long chemin ?
Corrigé de la question 1
1. Le principe. Si l'on traite les sommets dans un ordre topologique, alors tout prédécesseur d'un sommet est traité avant lui. Au moment où l'on relâche les arcs sortants de , la valeur est donc déjà définitive : aucun arc ne pourra plus l'améliorer. Un seul passage suffit.
(* Plus courts chemins depuis s dans un graphe ORIENTE ACYCLIQUE pondere.
g.(u) est la liste des couples (voisin, poids), poids quelconques.
Precondition : g est acyclique. Complexite : Theta(n + m). *)
let chemins_dag g s =
let n = Array.length g in
let d = Array.make n infinity in
d.(s) <- 0.0;
(* INVARIANT : quand on traite u, d.(u) est definitif -- tous ses
predecesseurs ont deja ete traites. *)
List.iter (fun u ->
if d.(u) < infinity then
List.iter (fun (v, p) ->
if d.(u) +. p < d.(v) then d.(v) <- d.(u) +. p) g.(u))
(tri_topologique g);
d
Le test if d.(u) < infinity n'est pas décoratif : sans lui, on calculerait , qui vaut en flottant mais déborderait avec un entier sentinelle. Il évite aussi de propager depuis les sommets inaccessibles.
Aucune positivité n'est requise, et c'est la différence avec Dijkstra : l'argument n'est plus « le minimum courant est définitif » mais « les prédécesseurs sont traités avant » — une propriété de l'ordre, pas des poids.
Question 2 : comment l'IA t'aide
2. Montrer qu'il calcule aussi les plus longs chemins, en changeant un seul symbole.
Élève
Pour les plus longs chemins, il faut garder le maximum au lieu du minimum. Mais je me méfie : le plus long chemin est réputé difficile, et l'argument du 1) ne reposait-il pas sur le fait qu'on minimise ?
IA
Relis l'invariant écrit dans le code du 1) : sur quoi repose-t-il exactement, l'ordre de traitement des sommets ou la nature de l'opération ? Reste-t-il vrai si l'on garde le maximum ?
Élève
Il repose sur l'ordre topologique : tous les prédécesseurs sont traités avant, quel que soit le critère. Mais si je garde l'initialisation à l'infini, aucune valeur ne pourra jamais être dépassée.
IA
Bien vu. Par quelle valeur faut-il initialiser les sommets non encore atteints, et que devient alors le test qui évite de propager depuis un sommet inaccessible ?
L'IA ne donne pas la réponse : elle pose la question qui fait avancer. À toi de continuer.
Continue cet exercice avec l'IA
Reprends la question 2 là où le dialogue s'arrête, puis la suite de l'exercice.
Continuer avec l'IA — gratuit, sans inscriptionGratuit, sans inscription. L'IA te guide pas à pas, sans te donner la réponse.