Vous êtes sur la page 1sur 2

Algorithmique et Programmation Projet : Arbres couvrants minimaux par lalgorithme de Kruskal et application au probl` eme du voyageur de commerce

Ecole normale sup erieure D epartement dinformatique td-algo@di.ens.fr 2011-2012


Dans un graphe non-orient e pond er e G = (V, E, w), un arbre couvrant minimal A est un ensemble dar etes de G qui : i) est un arbre (cest-` a-dire connexe et acyclique) ii) touche tous les sommets de G (cest couvrant) iii) est de poids minimal, cest-` a-dire que
{u,v }A

w(u, v ) est minimal

Algorithme de Kruskal pour larbre couvrant minimal

Lalgorithme de Kruskal (voir [1, 24.2]) est un algorithme glouton. Il construit une for et dont tous les el ements nissent par fusionner pour former un arbre couvrant. Pour cela, il maintient une partition P P (S ) des nuds S . Voici le pseudo-code de lalgorithme de Kruskal :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:

function ACM-Kruskal(G) A P for each x V do MakeSet(P, x) trier E par ordre croissant de poids w for all {s, t} E (dans lordre) do if Find(P, s) = Find(P, t) then A A {{s, t}} Union(P, s, t) end if end for end function return A Je vous renvoie au Cormen pour une preuve de correction.

Union-Find. Lalgorithme de Kruskal est ecacement impl ement e avec la structure de donn ee UnionFind (voir [1, 22.3]). Cette structure de donn ee g` ere une collection densemble disjoints contenant des el ements dun m eme univers. Elle supporte les trois op erations suivantes : i) MakeSet(P, x) : cr e ee dans P un ensemble singleton contenant x. ii) Union(P, x, y ) : indique quen fait x et y appartiennent au m eme ensemble. iii) Find(P, x) : renvoie le repr esentant canonique de lensemble contenant x. Si on utilise une telle structure, ainsi quun algorithme de tri en O (n log n), lalgorithme de Kruskal est en O (|E | log |E |). Tri ecace. Pour trier la liste des ar etes, on impl ementera un tri rapide (a.k.a. QuickSort), mais on utilisera un tri par insertion pour les appels r ecursifs en de c` a dune certaine taille (par exemple 100, mais il faut ajuster exp erimentalement). Pour choisir le pivot dans le QuickSort, on choisira 3 elements du tableau et on prendra celui du milieu (cest la technique dite median of three). Strictement parlant, ce tri est en O n2 dans le pire des cas, mais en pratique il est bien plus rapide que le tri fusion ou que les tri en O (n log n). 1

Application au probl` eme du voyageur de commerce

Une des applications classique des arbres couvrant minimaux est un algorithme de 2-approximation pour le probl` eme du voyageur de commerce. Soit G = (V, E, w) un graphe complet (E = S 2 ), pond er e, non orient e et qui v erie lin egalit e triangulaire : s, t, u V, w({s, u}) w({s, t}) + w({t, u}). On cherche ` a trouver un circuit, cest ` a dire n un chemin s1 , . . . , sn V passant une et une seule fois par chaque sommet, de poids i=1 w({si , si+1 }) minimal (avec la convention sn+1 = s1 ). On peut montrer (ce quon ne demande pas, voir [1, 37.2.1]) que le parcours pr exe dun arbre couvrant minimal de G est un circuit de poids au plus double du poids minimal. Vous ecrirez une fonction C qui prend en argument un graphe complet de taille arbitraire et calcule un circuit gr ace ` a cette heuristique. La sortie sur ecran sera la liste, dans lordre, des sommets ` a visiter suivie du poids du circuit. Les poids seront de type 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 (an de sassurer que lin egalit e triangulaire est v eri e) : pour chaque sommet si S , on choisit une position al eatoire (xi , yi ) R2 dans le plan ; chaque ar ete a alors pour poids la distance euclidienne entre ses extr emit es : w({si , sj }) = (xi xj )2 + (yi yj )2

Travail demand e

Vous ecrirez une fonction C qui calcule un arbre couvrant minimal par lalgorithme de Kruskal. Largument de la fonction sera un graphe connexe de taille arbitraire sous forme de listes dadjacence (ecace pour repr esenter les graphes peu denses). Les poids seront de type double. La sortie sur ecran sera la liste des ar etes qui forment larbre (dans un ordre quelconque) suivie du poids de larbre. Votre fonction utilisera la structure de donn ees Union-Find ainsi que lalgorithme de tri que vous devrez egalement programmer. Vous ecrirez egalement un programme de d emonstration qui calcule des arbres couvrants minimaux sur des graphes connexes g en er es al eatoirement. Le programme prendra en argument en ligne de commande le nombre de sommets V et le nombre dar etes E des graphes ` a g en erer. Enn, vous ferez quelques exp eriences en variant |E | et |V | pour v erier exp erimentalement le co ut th eorique (attention au co ut de la g en eration du graphe et de la sortie sur ecran).

R ef erences
[1] Thomas H. Cormen, Cliord Stein, Ronald L. Rivest, and Charles E. Leiserson. Introduction ` a lalgorithmique. Dunod, 2nd edition, 2001.