sous forme de listes d’adjacence. Les poids sont de type entier. La sortie sur ´ecran est la liste des arˆetes qui
forment l’arbre (dans un ordre quelconque) suivie du poids de l’arbre. Ainsi, votre travail se d´ecompose
en les ´etapes suivantes.
1. Impl´ementation d’une fonction pour tester si un graphe est connexe. La fonction prend en entr´ee
un graphe de taille arbitraire donn´e sous forme de listes d’adjacence, et donne en sortie une valeur
binaire, vrai ou faux.
2. Implementation d’une fonction qui prend en entr´ee deux entiers net m∈[n−1, n(n−1)/2] et
donne en sortie un graphe connexe `a nsommets et marˆetes donn´e sous forme de listes d’adjacence.
Vous pourrez utiliser la m´ethode de rejet : faire de mani`ere r´ep´et´ee une g´en´eration al´eatoire d’un
graphe `a nsommets et marˆetes, jusqu’`a ce que le graphe obtenu soit connexe.
3. Impl´ementation na¨
ıve de l’algorithme de Prim. Tests sur des graphes connexes al´eatoires dont les
arˆetes ont des poids al´eatoires uniformes entre 1 et 1000.
4. Impl´ementation d’une file de priorit´e avec un tableau. Impl´ementation de l’algorithme de Prim avec
une file de priorit´e. Tests.
5. Impl´ementation d’une file de priorit´e avec un tas de Fibonacci. Impl´ementation de l’algorithme de
Prim avec une file de priorit´e. Tests.
6. Comparaison entre la complexit´e en temps des diverses impl´ementations de l’algorithme de Prim.
Quelles sont, selon les impl´ementations, les plus grandes valeurs de (n, m) pour lesquelles le pro-
bl`eme puisse ˆetre r´esolu en un temps raisonnable (de l’ordre de quelques secondes) ?
3 Bonus
Cette partie est optionnelle.
On peut utiliser l’arbre couvrant minimum pour obtenir un tour qui donne une solution approch´ee
au probl`eme du voyageur de commerce, comme suit.
Soit G= (V, E, w) un graphe complet (Eest l’ensemble de toutes les paires de sommets de V),
pond´er´e, non orient´e et dont les poids sont positifs ou nuls et v´erifient l’in´egalit´e triangulaire : ∀s, t, u ∈
V, w({s, u})≤w({s, t}) + w({t, u}). On cherche `a trouver un tour, c’est `a dire un chemin s1, . . . , sn∈V
passant une et une seule fois par chaque sommet, et qui soit de poids Pn−1
i=1 w({si, si+1}) + w({sn, s1})
minimal. Il est connu (voir [?,§37.2.1]) que le parcours pr´efixe d’un arbre couvrant minimal de Gest un
tour de poids au plus double du poids minimal.
Vous ´ecrirez une fonction qui prend en argument un graphe complet de taille arbitraire, dont les poids
sont positifs ou nuls et v´erifient l’in´egalit´e triangulaire, et qui calcule un circuit grˆace `a cette heuristique.
La sortie sur ´ecran sera la liste, dans l’ordre, des sommets `a visiter suivie du poids du circuit. Les poids
seront de type flottant double.
Vous ´ecrirez ´egalement un programme de d´emonstration qui teste votre fonction sur des graphes
al´eatoires. Le programme prendra en argument en ligne de commande le nombre de sommets des graphes
`a g´en´erer. Les graphes seront g´en´er´es de la mani`ere suivante (afin de s’assurer que l’in´egalit´e triangulaire
est v´erifi´ee) : pour chaque sommet si∈S, on choisit une position al´eatoire uniforme (xi, yi)∈[0,1]2
dans le carr´e unit´e ; chaque arˆete a alors pour poids la distance euclidienne entre ses extr´emit´es :
w({si, sj}) = q(xi−xj)2+ (yi−yj)2
2