Soit deux arbres minimaux Fet F′diff´erant au moins sur l’arˆete α∈F\F′. Alors, d’apr`es la question 11, il existe une arˆete
βde F′qui relie les deux composantes connexes que reliait αdans F. Supposons sans perte de g´en´eralit´e v(α)< v(β). Alors
F′\{β} ∪ {alpha}est couvrant de poids strictement inf´erieur `a F′, contradiction.
Question 15 Soit H= (F, W )un arbre recouvrant minimal de G= (E, V ). Montrer qu’il existe a∈Wet b∈E\Wtelles que
(F, V ∪ {b}\{a})soit un arbre recouvrant de Gde poids minimal parmi les arbres recouvrants qui ne sont pas de poids minimal. On
supposera dans la fin de cette section que les arˆetes sont de poids deux `a deux distincts.
Il suffit de consid´erer pour bl’arˆete de poids minimal parmi celles qui relient les mˆemes composantes connexes que a. La question
11 permet de conclure.
Question 16 D´eduire de ce qui pr´ec`ede un algorithme construisant un arbre Gde poids minimal parmi les non minimaux. Complexit´e
de cet algorithme ?
On remarque qu’il s’agit simplement d’appliquer l’algorithme construisant l’arbre minimal dans le graphe ne comportant pas
l’arˆete consid´er´ee.
let non_minimal g a = (spanningtree_Kruskal Sommets = g.Sommets ;
Aretes = subtract g.Aretes a) ; ;
Question 17 A-t-on unicit´e de l’arbre de poids minimal parmi les non-minimaux ?
Oui, puisque les poids des arˆetes sont deux `a deux distincts, et d’apr`es la quesiton 14.
5 Algorithme de Prim
Question 18 Ex´ecuter (`a la main) l’algorithme de Prim sur le graphe de la fig. 1.
Voir la fig. 3.
Question 19 D´emontrer que l’algorithme de Prim renvoie bien un arbre couvrant minimal.
Il est clair que l’algorithme de Prim termine et fournit un sous-arbre couvrant. Prouvons qu’il est minimal.
Proof: Soit Uune solution minimale telle que le nombre d’´etapes de l’algorithme pendant lesquelles l’arbre en cours de construction
est un sous-arbre de Usoit maximale. Consid´erons pr´ecisement cette ´etape o`u l’algorithme rajoute `a F⊂Uune arˆete α=x, y qui
n’est pas dans U,xest dans le graphe d´efini par Fet non y. Il existe un chemin reliant x`a ydans U. Soit βla premi`ere arˆete
travers´ee par ce chemin, qui sort de F. On a v(α)≤v(β) par d´efinition de αdans l’algorithme. Rempla¸cons βpar αdans Upour
obtenir U′.U′est encore un arbre-couvrant minimal (supprimer βs´epare Uen deux composantes connexes que αr´eunit). Cela
contredit la d´efinition de U.
Question 20 Impl´ementer l’algorithme de Prim. On ´ecrira tout d’abord une fonction poids qui renvoie le poids d’un graphe pass´e
en param`etre, puis une fonction cherche_areteP qui prend en arguments une liste de sommets et une liste d’arˆetes, et qui renvoie
la premi`ere arˆete de la liste qui ne relie pas deux sommets cette premi`ere liste.
let poids g =
let rec aux = function
| [] →0
|(Edge(_,_,p)) : :q →p + aux q
in aux (g.Aretes)
; ;
let rec cherche_areteP sommets = function
| [] →failwith "Graphe non connexe"
| (Edge(x,y,_) as a) : :q →
let tmpx = mem x sommets and tmpy = mem y sommets in
if ((tmpx && (not tmpy)) || ((not tmpx) && tmpy))
then a
else cherche_areteP sommets q
; ;
let spanningtree_Prim g =
let rec aux sommets aretes spantree = function
| [] →Sommets = sommets ; Aretes = spantree
| reste →
let (Edge(x,y,_) as a) = cherche_areteP sommets aretes
in aux (union sommets [x ;y]) aretes (a : :spantree) (subtract reste [x ;y])
in let deb = g.Sommets.(0)
in aux [deb] (tri_aretes g.Aretes) [] (subtract (g.Sommets) [deb])
; ;