graphes en c++ arbres de recouvrement de coût minimal

publicité
INFO3012
Algorithmique
Laboratoire #3
GR A P H E S
E N C++
AR B R E S D E R E C O U V R E M E N T D E C O Û T M I N I M A L
I.
Implémentation
On continue avec l’implémentation par liste d’adjacence, donc les fichiers :
+ graphe.h (Classe virtuelle Graphe) ;
+ grapheL.cpp (Classe grapheL) ;
+ liste.cpp (Programme principal).
II.
Algorithme de Prim
L’algorithme 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 l’appel 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
L’algorithme de Kruskal utilise la méthode “Union-Find”.
On utilisera l’exemple 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 l’appel 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
IV.
Algorithmique
Laboratoire #3
Exemples d’entrées / sorties
Selon la manière dont sont implémentées les fonctions prim() et kruskal(),
l’ordre des paires de sommets peut varier mais le poids de l’arbre couvrant
minimal doit être le même.
+ Graphe orienté & pondéré (5 noeuds, 7 arcs) :
0 : -> 1 (10) -> 2 (3) -> 3 (20)
1 : -> 3 (5)
2 : -> 1 (2) -> 4 (15)
3 : -> 4 (11)
4 : (nil)
graphe5.in
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) :
0
1
2
3
4
5
6
:
:
:
:
:
:
:
->
->
->
->
->
->
->
1
0
0
0
1
2
3
prim.in
(2) -> 2 (4) -> 3 (1)
(2) -> 3 (3) -> 4 (10)
(4) -> 3 (2) -> 5 (5)
(1) -> 1 (3) -> 2 (2) -> 4 (7) -> 5 (8) -> 6 (4)
(10) -> 3 (7) -> 6 (6)
(5) -> 3 (8) -> 6 (1)
(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
Téléchargement