INFO3012 Algorithmique Laboratoire #3
GRAPHES EN C++
ARBRES DE RECOUVREMENT DE COÛT MINIMAL
I. Implémentation
On continue avec limplémentation par liste dadjacence, donc les fichiers :
+graphe.h (Classe virtuelle Graphe) ;
+grapheL.cpp (Classe grapheL) ;
+liste.cpp (Programme principal).
II. Algorithme de Prim
Lalgorithme de Prim utilise une file de priorité minimale (Min Heap).
On utilisera la classe PrioriteMin.
La fonction prim() à compléter dans grapheL.cpp utilise les librairies de la
STL vector et pair.
vector<pair<int,int>> prim()
{
// ...
}
Pseudocode :
- Pour tous les sommets t :
- cout[t] <-- Infini
- pred[t] <-- Null
- Fin pour
- cout[s] <-- 0
- Créer une file de priorité F de tous les sommets avec cout[.] comme priorité
- Tant que F est non vide :
- t <-- F.défiler()
- Pour toute arête t -> u :
- Si cout[u] > poids(t -> u) :
- cout[u] <-- poids(t -> u)
- pred[u] <-- t
- F.notifierDiminution(u)
- Fin si
- Fin pour
- Fin tant que
- Retourner pred
Éric Hervet 1/3 Hiver 2017
INFO3012 Algorithmique Laboratoire #3
Puis ajouter lappel de la fonction prim() dans le programme principal
(liste.cpp), afficher les paires de sommets connectés et le coût du chemin
de Prim (voir section IV.).
III. Algorithme de Kruskal
Lalgorithme de Kruskal utilise la méthode Union-Find.
On utilisera lexemple premiers.cpp.
La fonction kruskal() à compléter dans grapheL.cpp utilise également les
librairies vector et pair.
vector<pair<int,int>> kruskal()
{
// ...
}
Pseudocode :
- Initialiser un vecteur V de paires (vide)
- Initialiser un ensemble S de sommets (vide)
- Pour chaque sommet s, ajouter le singleton {s} dans S
- Trier toutes les arêtes du graphe en ordre croissant de poids w (ensemble E)
- Pour chaque paire de sommets (s,t) de E (dans l'ordre croissant) :
- Si Find(S,s) != Find(S,t) alors :
- Ajouter la paire {s,t} à V
- Union(S,s,t)
- Fin si
- Fin pour
- Retourner V
Puis ajouter lappel de la fonction kruskal() dans le programme principal
(liste.cpp), afficher les paires de sommets connectés et le coût du chemin de
Kruskal (voir section IV.).
Éric Hervet 2/3 Hiver 2017
INFO3012 Algorithmique Laboratoire #3
IV. Exemples dentrées / sorties
Selon la manière dont sont implémentées les fonctions prim() et kruskal(),
lordre des paires de sommets peut varier mais le poids de larbre couvrant
minimal doit être le même.
+Graphe orienté & pondéré (5 noeuds, 7 arcs) : graphe5.in
0 : -> 1 (10) -> 2 (3) -> 3 (20)
1 : -> 3 (5)
2 : -> 1 (2) -> 4 (15)
3 : -> 4 (11)
4 : (nil)
Arbre de recouvrement minimal (Prim) :
(0,2), (2,1), (1,3), (3,4) (poids : 21)
Arbre de recouvrement minimal (Kruskal) :
(0,2), (2,1), (1,3), (3,4) (poids : 21)
+Graphe non orienté, pondéré (7 noeuds, 10 arêtes) : prim.in
0 : -> 1 (2) -> 2 (4) -> 3 (1)
1 : -> 0 (2) -> 3 (3) -> 4 (10)
2 : -> 0 (4) -> 3 (2) -> 5 (5)
3 : -> 0 (1) -> 1 (3) -> 2 (2) -> 4 (7) -> 5 (8) -> 6 (4)
4 : -> 1 (10) -> 3 (7) -> 6 (6)
5 : -> 2 (5) -> 3 (8) -> 6 (1)
6 : -> 3 (4) -> 4 (6) -> 5 (1)
Arbre de recouvrement minimal (Prim) :
(0,3), (0,1), (3,2), (3,6), (6,5), (6,4) (poids : 16)
Arbre de recouvrement minimal (Kruskal) :
(0,3), (0,1), (3,2), (3,6), (6,5), (6,4) (poids : 16)
Éric Hervet 3/3 Hiver 2017
1 / 3 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 !