Structures de données IFT-2000

Slides:



Advertisements
Présentations similaires
La recherche de chemin optimal
Advertisements

Théorie des graphes.
Explorer un espace d’états
Portée des variables VBA & Excel
Structures de données et complexité
Introduction à l’Algorithmique
GEF 435 Principes des systèmes d’exploitation
Problème de 8 dames: Sachant que dans un jeu des échecs, une dame peut pendre toute pièce se trouvant sur la colonne ou sur la ligne ou sur les diagonales.
Chap. 1 INTRODUCTION Beaucoup de problèmes de la vie courante, tels la gestion de réseaux de communication ou l'ordonnancement de tâches, correspondent.
Chap. 1 Structures séquentielles : listes linéaires
Utilisation des tableaux
Chapitre VIII. Introduction aux graphes
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Structures de données linéaires
IPA – Catherine Faron Zucke et Anne Marie Deryr. suite ordonnée d'éléments de taille variable ArrayList liste; liste = new ArrayList (); Ne peuvent contenir.
Récursivité.
Plus courts chemins On présente dans ce chapitre un problème typique de cheminement dans les graphes : la recherche d'un plus court chemin entre deux sommets.
Algorithmes Branch & Bound
II. Chaînage, SDD séquentielles
Heuristiques A. Introduction B. Recherche d ’une branche
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
Bibliothèque standard du C++
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Structures de données IFT-2000
Pr ZEGOUR Djamel Eddine
LES ARBRES IUP 2 Génie Informatique
Algorithme de Bellman-Ford
Examen intra #1 Types abstraits, liste, pile, file et file prioritaire. Les graphes Récursivité.
IFT-2000: Structures de données Les graphes Dominic Genest, 2009.
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000
Modèles d’implantation
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Standard Template library Édition Septembre 2009 Département dinformatique et de génie logiciel.
Structures de données IFT Abder Alikacem Gestion des exceptions Département dinformatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-10541
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 7 : Classes et fonctions paramétrables Département.
Structures de données IFT-2000
Structures de données IFT-2000
Présentation Structures de Données et TDA
Algorithmes d ’approximation
Recherche Opérationnelle
Les Algorithmes de Tri Introduction Tri par Sélection
Programmation dynamique
IFT-2000: Structures de données Piles et files Dominic Genest, 2009.
Structures de données IFT-2000
Structures de données IFT-10541
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000
Structures de données IFT Abder Alikacem Linéarisation des matrices Département dinformatique et de génie logiciel Édition septembre 2009.
Pour le chemin le plus court pour tous les couples
Structures de données IFT-2000 Abder Alikacem Semaine 11 Gestion des arbres binaires de tri et de recherche. Les arbres cousus. Les arbres n-aires Département.
Structures de données IFT-2000 Abder Alikacem Retour sur les listes ordonnées Département dinformatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000 Abder Alikacem Arbres de recouvrement minimum Département dinformatique et de génie logiciel Édition Septembre 2009 JFK.
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.

Structures de données IFT-2000
Exploration systématique de graphes
Graphes 1. Introduction 2. Définition 3. Représentation mémoire
Arbres et graphes.
LES PILES ET FILES.
Programmation linéaire en nombres entiers
Chaînage et LSC : motivation et principe Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
ETNA – 1ème année Guillaume Belmas –
Exploration systématique de graphes
Cours LCS N°4 Présenté par Mr: LALLALI
Structures de données IFT-2000
Traversées (Parcours ) de graphes
Transcription de la présentation:

Structures de données IFT-2000 01/04/2017 Structures de données IFT-2000 Abder Alikacem Les graphes (2) Semaine 6 Édition Septembre 2009 Département d’informatique et de génie logiciel Vice-rectorat à la recherche / octobre 2005

Plan Parcours d’un graphe par contagion (ou largeur) 01/04/2017 Plan Parcours d’un graphe par contagion (ou largeur) Parcours d’un graphe par sondage (ou profondeur) Description d’un graphe en terme de type abstrait Implantation 4 2 5 3 1 Vice-rectorat à la recherche / octobre 2005

Défilement d’un graphe 01/04/2017 Défilement d’un graphe opération importante  visite d’un graphe problème : éviter les circuits !!! solution : marquer les nœuds (Petit-Poucet) 4 2 5 3 1 Vice-rectorat à la recherche / octobre 2005

Défilement d’un graphe 01/04/2017 Défilement d’un graphe opération importante  visite d’un graphe problème : éviter les circuits !!! solution : marquer les nœuds (Petit-Poucet) 4 2 5 3 1 x Vice-rectorat à la recherche / octobre 2005

Défilement d’un graphe 01/04/2017 Défilement d’un graphe opération importante  visite d’un graphe problème : éviter les circuits !!! solution : marquer les nœuds (Petit-Poucet) 4 2 5 3 1 x x x Vice-rectorat à la recherche / octobre 2005

Marquer les nœuds (Petit-Poucet) 01/04/2017 Marquer les nœuds (Petit-Poucet) De nombreux algorithmes relatifs aux graphes nécessitent une procédure qui permet l'examen systématique des noeuds et des arêtes (arcs) d'un graphe G donné. La procédure consiste à classer les sommets en 3 catégories: La catégorie A des sommets déjà visités. La catégorie B des sommets adjacents à ceux de la catégorie A mais pas encore visités (sommets qui peuvent être atteints). La catégorie C des sommets invisibles qui n'ont pas encore été rencontrés du tout (qui ne peuvent pas être atteints depuis un sommet déjà visité). Vice-rectorat à la recherche / octobre 2005

Marquer les nœuds (Petit-Poucet) Les différentes variantes de parcours dépendront de la manière dont on fait passer les sommets de la catégorie C à la catégorie B et de la B dans la A. On construit l'état initial en plaçant le sommet de départ dans la catégorie B et tous les autres dans la catégorie C. On répète alors : faire passer un sommet x de la catégorie B à la catégorie A; mettre dans la catégorie B tous les sommets de catégorie C adjacents à x.

Marquer les nœuds (Petit-Poucet) Au cours de l'exécution de nos algorithmes, chaque noeud N de G sera dans l'un des trois états suivants : STATUS = 1  : (Prêt) État initial du noeud N STATUS = 2  : (Attente) Le noeud N est soit empilé, soit dans la file d'attente, en attente d'être traité. STATUS = 3  : (Traité) Le noeud N a été traité. Noter qu’au lieu de marquer les nœuds par 1, 2 ou 3, peut simplement le faire En utilisant un booléen: vrai : le nœud est soit traité soit en attente d’être traité (status =1 ou 2) Faux: le nœud n’a pas été parcouru (status = 1)

Défilement d’un graphe Il existe deux manières standard d'exécuter ces opérations: Parcours par contagion ou par largeur Parcours par sondage ou en profondeur

Défilement d’un graphe 01/04/2017 Défilement d’un graphe L'algorithme de recherche par sondage ou en profondeur (Depth-First Search ou DFS) permet: d'explorer un graphe, d'en déterminer les composantes connexes, de découvrir s'il contient des cycles. Cet algorithme de parcours dans un graphe a été mis au point par Trémaux au siècle dernier pour résoudre le problème de la sortie d'un labyrinthe. Trémaux qui n'avait pas la possibilité d’utiliser la récursivité à l'époque utilisait un ''fil d'Ariane'' lui permettant de se souvenir par où il était arrivé à cet endroit dans le labyrinthe. L'algorithme utilise une pile pour le parcours du graphe à partir d'un sommet donné. On progresse le long d'un de ces arcs et, si l’on ne trouve pas ce que l’on cherche, on progressera alors le long d'un autre de ces arcs. Vice-rectorat à la recherche / octobre 2005

Défilement d’un graphe L’algorithme de recherche par contagion ou en largeur (Breadth-First Search ou BFS) est à la base de la résolution de problèmes tels que celui du chemin minimum. Le principe: si l'on suppose que tout un groupe de personnes entreprennent l'exploration d’une ville, à chaque carrefour, le groupe pourra se partager pour aller dans toutes les directions à la fois. L'algorithme utilise une file pour le parcours du graphe à partir d'un sommet donné.

Défilement d’un graphe Exemple au tableau

01/04/2017 Parcours en largeur Initialiser (mettre à « faux ») une marque (une valeur booléenne) associée à chaque nœud. Enfiler et marquer (mettre sa marque à « vrai ») le nœud de départ. Tant et aussi longtemps que la file n’est pas vide: Défiler le prochain nœud. Pour chaque voisin qui n’est pas marqué: Le marquer L’enfiler. Remarque: S’il s’agit d’un parcours fait pour retrouver un chemin comportant le plus petit nombre d’étapes entre deux nœuds donnés, alors on peut s’arrêter dès qu’on atteint le nœud d’arrivée. Aussi, si on veut la description de ce chemin, il faut mémoriser le meilleur précédent pour chaque nœud, un peu de la même façon que la modification qui a été faite à l’algorithme de Floyd pour les chemins (sauf que ce ne sera plus dans une matrice mais dans un tableau à une dimension). Vice-rectorat à la recherche / octobre 2005

Parcours en largeur () () () ✓ F Nœud de départ E A B D () () G () C 01/04/2017 Parcours en largeur () () () F ✓ Nœud de départ E A B D () () G () C () File A Vice-rectorat à la recherche / octobre 2005

Parcours en largeur () () () ✓ F Nœud de départ E A B D () () G () C 01/04/2017 Parcours en largeur () () () F ✓ Nœud de départ E A B D () () G () C () File Défilé: A Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D () (A) G ✓ 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D () (A) G ✓ (A) ✓ C () File G ; B ; F Défilé: A Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (A) () G ✓ 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D () (A) G ✓ (A) ✓ C () File B ; F Défilé: G Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (A) () G ✓ 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D () (A) G ✓ (A) ✓ C () File F Défilé: B Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ F ; C ; D Défilé: B Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ C ; D Défilé: F Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ D Défilé: C Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ Défilé: D Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ Meilleur chemin entre A et D: D Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ Meilleur chemin entre A et D: D Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ Meilleur chemin entre A et D: B D Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ Meilleur chemin entre A et D: B D Vice-rectorat à la recherche / octobre 2005

Parcours en largeur (A) ✓ () () ✓ F Nœud de départ E A B D (B) (A) ✓ G 01/04/2017 Parcours en largeur (A) () ✓ () F ✓ Nœud de départ E A B D (B) (A) G ✓ ✓ (A) ✓ C (B) File ✓ Meilleur chemin entre A et D: A B D Vice-rectorat à la recherche / octobre 2005

Parcours par contagion 01/04/2017 Parcours par contagion Questions Est-ce que tout graphe peut être parcouru par cet algorithme ? 1 1 2 2 5 4 5 4 3 3 Comment modifier l’algorithme pour que tout graphe soit parcouru ? Comment est-ce que l’algorithme s’arrêtera ? Pourquoi est-ce que ça marche bien pour trouver le chemin le plus court ? Quelle est la complexité de l’algorithme de parcours par largeur? L’algorithme prend un temps O(n+m) Vice-rectorat à la recherche / octobre 2005

Algorithme parcours en profondeur 01/04/2017 Algorithme parcours en profondeur Initialiser (mettre à « faux ») une marque (une valeur booléenne) associée à chaque sommet pour dire qu’il n’a pas été parcouru. Empiler et marquer le nœud de départ. Tant et aussi longtemps que la pile n’est pas vide: Dépiler un nœud, et lui faire le traitement voulu pour le parcours (par exemple, afficher sa valeur à l’écran). Pour chacun de ses voisins qui n’est pas marqué: Le marquer. L’empiler. Remarque: Ce parcours n’est pas approprié pour retrouver le chemin le plus court entre deux nœuds donnés. Il est cependant très facile à implanter par une fonction récursive. Vice-rectorat à la recherche / octobre 2005

Algorithme parcours en profondeur 01/04/2017 Algorithme parcours en profondeur Vice-rectorat à la recherche / octobre 2005

Algorithme parcours en profondeur 01/04/2017 Algorithme parcours en profondeur Une approche par « BackTracking » Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur F ✓ Nœud de départ E A B D G C Pile A Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur F ✓ Nœud de départ E A B D G C Pile Dépilé: A Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur ✓ F ✓ Nœud de départ E A B D ✓ G ✓ C Pile G ; B ; F Dépilé: A Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur ✓ F ✓ Nœud de départ E A B D ✓ G ✓ C Pile G ; B Dépilé: F Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur ✓ F ✓ Nœud de départ E A B D ✓ G ✓ C Pile G Dépilé: B Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur ✓ F ✓ Nœud de départ E A B D ✓ ✓ G ✓ C ✓ Pile G ; C ; D Dépilé: B Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur ✓ F ✓ Nœud de départ E A B D ✓ ✓ G ✓ C ✓ Pile G ; C Dépilé: D Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur ✓ F ✓ Nœud de départ E A B D ✓ ✓ G ✓ C ✓ Pile G Dépilé: C Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur ✓ F ✓ Nœud de départ E A B D ✓ ✓ G ✓ C ✓ Pile Dépilé: G Vice-rectorat à la recherche / octobre 2005

Parcours en profondeur 01/04/2017 Parcours en profondeur ✓ F ✓ Nœud de départ E A B D ✓ ✓ G ✓ C ✓ Pile FIN Vice-rectorat à la recherche / octobre 2005

Parcours par sondage Questions 01/04/2017 Parcours par sondage Questions Peut-on parcourir tout un graphe avec ce type de parcours ? Comment l’algorithme s’aperçoit-il qu’il est dans un cul-de-sac et qu’il doit faire du retour-arrière (« backtracking ») ? Est-ce que ce parcours peut être utilisé pour trouver le chemin le plus court ? Quelle est la complexité de l’algorithme de parcours en profondeur? L’algorithme prend un temps O(n+m) Vice-rectorat à la recherche / octobre 2005

Comparaison des deux parcours 01/04/2017 Comparaison des deux parcours Le graphe correspondant est obtenu en plaçant un sommet en chaque point du labyrinthe où il y a plus d'un chemin possible et, ensuite, en connectant les sommets conformément à l'architecture du labyrinthe. Vice-rectorat à la recherche / octobre 2005

Comparaison des deux parcours 01/04/2017 Comparaison des deux parcours Vice-rectorat à la recherche / octobre 2005

Spécifications de l’interface du type Graphe Description en termes de types abstraits 1. ajouter un sommet à un graphe 2. ajouter un arc/arête à un graphe 3. ôter un sommet du graphe et tous les arcs/arêtes associés 4. ôter un arc/arête 5. permettre l'accès à un sommet nommé (désigné) 6. indiquer si un sommet n'a pas de voisins 7. parcourir les voisins d'un sommet (parcours) 8. voir si un chemin existe entre 2 sommets 9. trouver le chemin le plus court (# arêtes, distance) 10. trouver tous les chemins entre 2 sommets Etc..

Implantation Il existe deux principales méthodes de modélisation des graphes en tant que type abstrait: les matrices et les listes dites de connectivité ou d'adjacence. Le choix entre elles se fera en fonction de la densité du graphe. Par densité, on entend la proportion d'arcs effectifs par rapport au nombre maximum d'arcs ou d’arêtes possibles: NbArcs / NbSommets2 dans le cas de graphe orienté. NbAretes / (NbSommets(NbSommets-1)/2) dans le cas d’un graphe non orienté

Implantation Matrice d’adjacence Une matrice de valeurs booléennes de dimension NbSommets*NbSommets pour indiquer qu'il y a un arc entre un sommet x et un sommet y. On suppose que les sommets du graphe sont étiquetés de 0 à N S’il existe une arête/arc du sommet i au sommet j, on met 1 à la position A[i][j], sinon on met 0 comme valeur. Si le graphe est valué, on met à la position A[i][j], le poids associé à l’arête/arc, 0 pour la position A[i][i],  ailleurs. Si le graphe est peu dense, ce qui est souvent le cas, il y aura beaucoup de 0 dans la matrice. Cette méthode de représentation est donc indiquée si le graphe est dense car il faut NbSommets2 booléens pour stocker le graphe et NbSommets2 étapes pour initialiser la matrice.

Implantation Listes d’adjacence Pour chaque sommet, on associe une liste de tous les autres sommets auquel il est lié par une arête dont il est l’origine En principe (tout comme avec la matrice d’adjacence), il faut une table qui associe l’identificateur de chaque sommet à un numéro interne dans la représentation En C++, cette table peut nous retourner un pointeur sur la structure qui représente le sommet

Interface class Arete { public: int u; int v; Arete(int u, int v) {this->u = u; this->v = v; } Interface template <typename T> class Graphe { public: /** Constructeur (graphe vide)*/ Graphe(); /** Constructeur à partir des sommets et arcs/arêtes*/ Graphe(vector<T> sommets, vector<Arete> aretes); Graphe (const Graphe&); Graphe(const Graphe&g, const std::vector<T>&sommets); ~Graphe (); Graphe& operator = (const Graphe&); void ajouterSommet(const T& s); void ajouterArc (const T& s1, const T& S2); void enleverArc (const T& s1, const T& s2); void enleverSommet ( const T& s); bool sommetExiste(const T& s) const; int nbSommets() const; // etc... private: //… class Sommet { public: …getData(); void setData(..); //etc.. private: … data; int no; int tag; bool pres; }

Implantation dans une matrice d’adjacence Classe Graphe Implantation dans une matrice d’adjacence template <typename T> class Graphe { public: //.. private: int nbSommets; T* sommets; int **mat; //implémentation dans une matrice } // de sommets adjacents 1 2 5 4 3 Cas d’un graphe orienté

Implantation dans une matrice d’adjacence Classe Graphe Implantation dans une matrice d’adjacence template <typename T> class Graphe { public: //.. private: int nbSommets; T* sommets; int **mat; // trop de perte mémoire!! } 1 2 5 4 3 Cas d’un graphe non orienté

Matrice triangulaire matrice d’adjacence : (avec graphe non orienté) 1 2 5 4 matrice d’adjacence : (avec graphe non orienté) On peut, pour un graphe non-orienté, économiser de l'espace en ne stockant que le triangle supérieur de la matrice symétrique. Matrice triangulaire possède 1 + 2 + 3 + ... + n = [n (n+1)] / 2 éléments. On la représente dans un tableau à une dimension (ou vector) ayant ce même nombre d'éléments. Si on la range par ligne, alors le tableau aura l'allure suivante : A00 A10 A11 A20 A21 A22 A30 ... An-1n-1 Si A00 est en position 0, alors l'adresse de tout lément Aij est donnée par : ( i +1 ) * i / 2 + j Ainsi, la position de A42 dans la matrice est équivalent à la position 12 dans le tableau. 3

Implantation dans une matrice d’adjacence Classe Graphe 1 1 1 1 1 1 2 1 3 1 1 1 1 Implantation dans une matrice d’adjacence 4 1 1 template <typename T> class Graphe { public: //.. private: int nbSommets; T* sommets; int *mat; // tableau à une dimension } 1 2 5 4 3 Cas d’un graphe non orienté ( i + 1 ) * i / 2 + j 1 1 1 1 1 1

Implantation dans une matrice d’adjacence Classe Graphe Implantation dans une matrice d’adjacence template <typename T> class Graphe { public: //.. private: vector<T> sommets; // Les sommets vector< vector<int> > voisins; // Les sommets adjacents } Utilisation de vector de la STL

Implantation dans une matrice d’adjacence Classe Graphe Implantation dans une matrice d’adjacence Remarque Dans ce type de représentation, on n’a pas le choix que de représenter les données reliées aux sommets dans une structure séparée. sommets =

Implantation dans une liste de sommets adjacents 1 2 3 Classe Graphe Implantation dans une liste de sommets adjacents template <typename T> class Graphe { public: //.. private: class Noeud { public: T data; /* au lieu de T data, on peut avoir T* ou int*/ Noeud * suivant; /* chaînage des sommets adjacents */ }; /* le noeud typique du graphe */ int nbSommet; /* nombre de sommets dans le graphe */ int nbSommetMax; /* nombre total possible de sommets */ T * sommet; /* tableau représentant les sommets*/ Noeud** listeSommet; /* les listes de sommets adjacents*/ } 1 1 3 2 2 1 3 2

Implantation dans une liste de sommets adjacents Classe Graphe Implantation dans une liste de sommets adjacents template <typename T> class Graphe { public: //.. private: class Noeud { public: T data; //données // dans un sommet list<int> voisins; }; vector<Noeud> listeSommets; } Utilisation de vector et list de la STL

Classe Graphe Implantation dans une liste de sommets adjacents Cas d’un graphe non orienté La liste des sommets adjacents soufre de la même redondance que nous avons rencontrer avec les matrices de sommets adjacents. Une solution plus efficace utilisation de listes d’arêtes Elle consiste à lier les arêtes un lien pour chaque arête vers les 2 sommets délimitant l’arête.

Cas d’un graphe non orienté Classe Graphe 4 Cas d’un graphe non orienté template <typename T> class Graphe { public: //.. private: class AreteNode { public: int sommet[2]; AreteNode * lien[2]; }; typedef AreteNode * AretePtr; class Noeud T data; AretePtr first; vector<Noeud> listeSommets; } B Liste des arêtes

Classe Graphe Liste des arêtes Chaque AreteNode représente une arête B Chaque AreteNode représente une arête sommet[1] et sommet[2] sont les sommets directement connectés par cette arête. Lien[1] pointe vers un autre AreteNode ayant sommet[1] comme délimitateur. Lien[2] pointe vers un autre AreteNode ayant sommet[2] comme délimitateur.