ioCode
Tri Topologique (Algorithme de Kahn)
Graphes orentés • Exercices 2A
Le but de cet exercice est d'implémenter l'algorithme de Kahn pour obtenir le tri topologique d'un graphe orienté acyclique (DAG).
Le graphe est représenté par un tableau de listes d'entiers (int list array), où l'indice correspond au sommet, et la liste contient ses successeurs (voisins sortants).
- Calculer les degrés entrants : Écrire une fonction1IndiceParcourez chaque nœud du graphe et itérez sur ses voisins pour incrémenter leurs degrés dans le tableau des degrés.
calculer_degres_entrants : int list array -> int arrayqui prend un graphe et renvoie un tableau contenant le nombre d'arêtes pointant vers chaque sommet (degré entrant). Par exemplelet g = [|[1; 2]; [3]; [3]; []|] in calculer_degres_entrants grenvoie[|0; 1; 1; 2|]. - Trouver les sources : Écrire une fonction2IndiceParcourez le tableau des degrés à l'envers (de la fin vers le début) et ajoutez les indices valant 0 dans une liste pour les avoir dans l'ordre croissant.
trouver_sources : int array -> int listqui prend le tableau des degrés entrants et renvoie la liste des sommets ayant un degré entrant de 0 (triée par ordre croissant). Par exemplelet deg = [|0; 1; 1; 2|] in trouver_sources degrenvoie[0]. - Mettre à jour les degrés : Écrire une fonction3IndiceDécrémentez le degré de chaque voisin, et si ce degré tombe exactement à zéro, ajoutez ce voisin à la liste des nouvelles sources.
mettre_a_jour_degres : int list array -> int array -> int -> int listqui prend le graphe, le tableau des degrés entrants et un sommetu. La fonction doit décrémenter le degré de tous les voisins deudans le tableau, et renvoyer la liste des voisins dont le degré vient de devenir exactement 0. Par exemple, sid = [|0; 1; 1; 2|], l'appelmettre_a_jour_degres g d 0renvoie[1; 2]et modifieden[|0; 0; 0; 2|]. - Traiter les sources : Écrire une fonction récursive4IndiceUtilisez le filtrage de motif (pattern matching) sur la liste des sources. Si elle est vide, renvoyez l'accumulateur renversé.
traiter_sources : int list array -> int array -> int list -> int list -> int listqui prend le graphe, le tableau des degrés, la liste des sources actuelles, et un accumulateur. À chaque étape, elle extrait une source, met à jour les degrés, ajoute les nouvelles sources trouvées à la liste des sources à traiter, et ajoute le sommet traité à l'accumulateur. Quand il n'y a plus de sources, elle renvoie l'accumulateur renversé. Par exempletraiter_sources g [|0; 0; 0; 2|] [1; 2] [0]renvoie[0; 1; 2; 3]. - Trier topologiquement : Écrire une fonction5IndiceEnchaînez les fonctions précédentes. Si la longueur de la liste finale n'est pas égale au nombre de sommets, alors le graphe contient un cycle (déclenchez une erreur).
trier_topologiquement : int list array -> int listqui orchestre les fonctions précédentes. Si la liste finale ne contient pas tous les sommets du graphe, levez une exception avecfailwith "Cycle detecte". Par exempletrier_topologiquement grenvoie[0; 1; 2; 3].
Langage
Console initialisée. En attente de l'interpréteur...