Prépa Code Connexion Inscription

Exercices de programmation pour classes préparatoires

← Retour aux exercices

Floyd-Warshall

ocaml ★★★★☆

Écrire une fonction floyd_warshall : int -> (int * int * int) list -> int array array qui calcule les plus courtes distances entre toutes les paires de sommets dans un graphe orienté pondéré à poids positifs.

Entrées : - n : le nombre de sommets (numérotés de 0 à n-1) - aretes : une liste de triplets (u, v, poids) représentant les arêtes orientées

Sortie : une matrice (tableau de tableaux) dist de taille n × n telle que dist.(i).(j) est la distance minimale de i à j, ou max_int s'il n'y a pas de chemin.

Rappel : Floyd-Warshall repose sur la programmation dynamique. On met à jour pour chaque sommet intermédiaire k : dist.(i).(j) <- min dist.(i).(j) (dist.(i).(k) + dist.(k).(j)).

Attention : quand dist.(i).(k) ou dist.(k).(j) vaut max_int, il ne faut pas additionner (risque de débordement arithmétique).

Exemples

AppelRésultat attendu
floyd_warshall 3 [(0, 1, 4); (1, 2, 3); (0, 2, 10)] [| [|0; 4; 7|]; [|max_int; 0; 3|]; [|max_int; max_int; 0|] |]
floyd_warshall 2 [(0, 1, 5); (1, 0, 2)] [| [|0; 5|]; [|2; 0|] |]

Votre code

Connectez-vous pour soumettre du code.