Lycée Carnot — 2016-2017 Option informatique MP/MP*
TP 8 : Algorithme de Prim pour les arbres couvrants
On rappelle qu’un arbre est un graphe connexe sans cycle.
Considérons un graphe G= (V,E)connexe. On peut pondérer les arêtes du graphe avec une fonction
p:ER, dite de pondération.
Dans ce TP, le graphe Gsera représenté par listes d’adjacence pondérées : G.(i)contient la liste des
sommets adjacents à idans Gavec le poids de l’arête associée : (int *int)list vect.
On considère maintenant un graphe non orienté Gconnexe et pondéré à poids positifs. Un arbre cou-
vrant du graphe G= (V,E)est un arbre A= (V,E0)connexe tel que E0E. L’objectif de ce TP est de
trouver un arbre couvrant minimal (soit, de poids minimum) de G.
1 Description de l’algorithme de Prim
L’algorithme de Prim construit un arbre couvrant minimal Aen procédant de la façon suivante :
Aun sommet squelconque de V.
Parmi toutes les arêtes accessibles depuis A, on en extrait une de poids minimal.
Si elle relie deux sommets déjà ajoutés à l’arbre, on l’ignore, sinon on l’ajoute à A, on met à jour les
arêtes accessibles depuis Aet on retourne à l’étape précédente.
QUESTION 1
Montrer que cet algorithme termine.
Pour l’implémenter, nous avons besoin d’une structure pour représenter l’ensemble des arêtes acces-
sibles depuis A. Cette structure doit nous permettre efficacement :
d’y insérer de nouveaux éléments ;
et d’en extraire l’élément minimum.
C’est ce que l’on appelle une file de priorité. Tout d’abord, nous allons simuler cette file de priorité avec
une liste triée (pas très efficace) puis avec un tableau ayant une structure de tas.
Voici un graphe sur lequel tester vos algorithmes :
let graphe1 = [|
[(1, 4); (7, 8)];
[(0, 4); (2, 8); (7, 11)];
[(1, 8); (3, 7); (5, 4); (8, 2)];
[(2, 7); (4, 9); (5, 14)];
[(3, 9); (5, 10)];
[(4, 10); (3, 14); (2, 4); (6, 2)];
[(5, 2); (8, 6); (7, 1)];
[(6, 1); (8, 7); (1, 11); (0, 8)];
[(2, 2); (6, 6); (7, 7)]
|];;
Deux arbres couvrants de poids minimaux pour ce graphe sont :
let arbre1 =
[|[1]; [2; 0]; [3; 5; 8; 1]; [4; 2]; [3]; [6; 2]; [7; 5]; [6]; [2]|]
;;
let arbre2 =
[|[7; 1]; [0]; [3; 8; 5]; [4; 2]; [3]; [2; 6]; [5; 7]; [6; 0]; [2]|]
;;
http://carnot.cpge.info 1
Lycée Carnot — 2016-2017 Option informatique MP/MP*
2 Implémentation de l’algorithme de Prim avec une liste triée
QUESTION 2
Écrire les fonctions insere et extrait_min pour une liste triée (avec une fonction de comparaison
quelconque compare qui sera fournie en argument). Quelle sont leurs complexités ?
QUESTION 3
Écrire la fonction maj_accessibles qui, quand un sommet est ajouté à l’arbre, met à jour (à l’aide
de la fonction insere) la liste triée des arêtes accessibles depuis A. On fera attention au fait que les listes
d’adjacence contiennent des couples de la forme (sommet,poids)alors que la liste à mettre à jour
possède des éléments de la forme (arete,poids).
QUESTION 4
Écrire une fonction prim1 qui implémente l’algorithme de Prim en utilisant une liste triée. Quelle est
sa complexité ?
3 Implémentation de l’algorithme de Prim avec une file de priorité (un tas)
Un tas-min est un arbre binaire qui vérifie les deux propriétés suivantes :
Chaque noeud a une valeur supérieure à celle de son père (la racine a donc la valeur minimale).
L’arbre est complet : pour un tas de taille n, si on numérote ses sommets par un parcours en largeur
alors le père de iest en case [à compléter] et ses fils sont dans les cases [à compléter].
La taille du tas étant appelée à être modifiée, celui-ci est représenté par un couple (t,n)test un
tableau de la taille maximale dont on aura besoin et nla taille réelle du tas :
type tas = {mutable taille :int;mutable elements : ((int *int)*int)vect};;
QUESTION 5
Écrire une fonction qui transforme un tableau quelconque en tas-min. Vous vous aiderez d’une fonction
entasser telle que entasser tas i suppose que les arbres enracinés en 2 i+1 et 2 i+2 dans le tas t
sont bien des tas-min, et transforme le tableau pour que la propriété de tas-min soit vérifiée pour le tableau
enraciné en isi elle n’est pas vérifiée.
QUESTION 6
Implémenter efficacement les fonctions insere_tas et extrait_min_tas pour un tas-min. Quelle
sont leurs complexités ?
QUESTION 7
Écrire une fonction prim2 qui implémente l’algorithme de Prim en utilisant un tas-min. Quelle est sa
complexité ?
QUESTION 8
Implémenter le tri par tas.
http://carnot.cpge.info 2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !