Création d’un graphe non orienté en C++ Boost et parcours en ordre de recherche en profondeur
La théorie des graphes est un domaine clé de l’informatique et de la programmation, et l’une des bibliothèques les plus couramment utilisées pour mettre en œuvre des algorithmes de graphes en C++ est Boost
. Dans cet article, nous allons relever le défi de créer un graphe non orienté en utilisant la bibliothèque Boost, puis de le parcourir en utilisant la méthode de recherche en profondeur (DFS).
Introduction au Problème
Créer et travailler avec des graphes peut être intimidant, mais avec Boost, cela devient beaucoup plus simple. La recherche en profondeur (DFS) est un algorithme fondamental utilisé pour explorer les sommets et les arêtes d’un graphe. Que vous cherchiez des chemins, vérifiiez la connectivité ou résolviez des énigmes, la DFS est une manière efficace de naviguer à travers les graphes.
Dans cet article, nous allons explorer un exemple concret de la mise en place d’un graphe non orienté et de la mise en œuvre d’un parcours DFS.
Vue d’Ensemble de la Solution
Nous allons couvrir les étapes suivantes :
- Inclure les en-têtes Boost nécessaires.
- Définir la structure du graphe.
- Créer une classe de visiteur pour gérer la découverte des sommets.
- Configurer la fonction principale pour construire le graphe et effectuer la DFS.
Étape 1 : Inclure les en-têtes Boost Nécessaires
Tout d’abord, vous devez inclure les en-têtes du graphe Boost, qui fournissent les classes et fonctions fondamentales pour les opérations liées aux graphes.
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <iostream>
Étape 2 : Définir la Structure du Graphe
Nous définissons notre graphe non orienté en utilisant boost::adjacency_list
. Voici comment vous pouvez le définir :
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS> MyGraph;
typedef boost::graph_traits<MyGraph>::vertex_descriptor MyVertex;
- Dans le code ci-dessus :
listS
indique que le graphe utilisera une liste d’arêtes.vecS
signifie que nous utiliserons un vecteur pour stocker des sommets.undirectedS
spécifie que le graphe est non orienté.
Étape 3 : Créer une Classe de Visiteur
La classe de visiteur est cruciale pour définir ce qui se passe lorsqu’un sommet est découvert pendant la DFS. Voici un exemple d’une simple classe de visiteur :
class MyVisitor : public boost::default_dfs_visitor {
public:
void discover_vertex(MyVertex v, const MyGraph& g) const {
std::cerr << v << std::endl; // Affiche le numéro du sommet
return;
}
};
Étape 4 : Configurer la Fonction Principale
Enfin, nous devons créer le graphe, ajouter des arêtes et invoquer l’algorithme DFS.
int main() {
MyGraph g;
boost::add_edge(0, 1, g); // Connecter le sommet 0 et 1
boost::add_edge(0, 2, g); // Connecter le sommet 0 et 2
boost::add_edge(1, 2, g); // Connecter le sommet 1 et 2
boost::add_edge(1, 3, g); // Connecter le sommet 1 et 3
MyVisitor vis;
boost::depth_first_search(g, boost::visitor(vis)); // Effectuer un parcours DFS
return 0;
}
Explication du Code
- Création du Graphe : Nous créons une instance de
MyGraph
appeléeg
. Nous ajoutons ensuite des arêtes spécifiant les connexions entre les sommets. - Exécution de la DFS : En créant une instance de
MyVisitor
, nous la passons comme visiteur àdepth_first_search
, qui parcourt le graphe et appellediscover_vertex
pour chaque sommet.
Conclusion
Utiliser la bibliothèque Boost pour créer et parcourir un graphe peut considérablement simplifier des tâches complexes en C++. En suivant les étapes décrites ci-dessus, vous pouvez réussir à implémenter la recherche en profondeur (DFS) sur un graphe non orienté.
L’application pratique des graphes est vaste, et comprendre la DFS est essentiel pour quiconque souhaite approfondir ses connaissances en algorithmes de graphes. Expérimentez avec ce code et modifiez la structure du graphe pour mieux répondre à vos besoins !