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:E→R, 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 E0⊂E. 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