Pouvez-vous s'il vous plaît publier un exemple de code pour niveler un graphe orienté en utilisant BGL? Définition de la mise à niveau: Vertex a la propriété "niveau entier". Pendant la traversée BFS du graphe, quand un sommet est "examiné", regardez les niveaux de ses sommets prédécesseurs, prenez le maximum de ceux-ci, incrémentez et assignez-le au "niveau" de ce sommet.nivellement de graphe utilisant BGL
2
A
Répondre
1
Si vous parlez de la profondeur BFS, ceci est déjà intégré pour booster BFS et peut être obtenu facilement.
Il suffit d'utiliser un vecteur pour stocker les profondeurs et une profondeur BFS visiteur comme cet exemple, je fait:
#include <iostream>
#include <vector>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/breadth_first_search.hpp>
using namespace std;
using namespace boost;
typedef adjacency_list < vecS, vecS, directedS,
property< vertex_index_t, size_t> ,
property< edge_index_t, size_t > > Graph;
typedef graph_traits<Graph>::vertex_descriptor Vertex;
typedef graph_traits<Graph>::edge_descriptor Edge;
int main(int argc, char* argv[]){
Graph G;
vector<Vertex> verts;
for(size_t i = 0; i < 9; ++i){
Vertex v = add_vertex(G);
verts.push_back(v);
}
/*
0 0
/\
1 1 4
/ \
2 2 5
/ \
3 3 6
\
4 7
\
5 8
*/
add_edge(verts.at(0),verts.at(1),G);
add_edge(verts.at(1),verts.at(2),G);
add_edge(verts.at(2),verts.at(3),G);
add_edge(verts.at(0),verts.at(4),G);
add_edge(verts.at(4),verts.at(5),G);
add_edge(verts.at(5),verts.at(6),G);
add_edge(verts.at(6),verts.at(7),G);
add_edge(verts.at(7),verts.at(8),G);
cout << "vertices " << num_vertices(G) << endl;
cout << "edges " << num_edges(G) << endl;
//store depths
vector<size_t> d(num_vertices(G));
//get an index map, from Graph definition property< vertex_index_t, size_t>
typedef boost::property_map< Graph, boost::vertex_index_t>::type VertexIndexMap;
VertexIndexMap v_index = get(boost::vertex_index, G);
// Create the external property map, this map wraps the storage vector d
boost::iterator_property_map< std::vector<size_t>::iterator, VertexIndexMap >
d_map(d.begin(), v_index);
//Start at 0
boost::breadth_first_search(G, verts.at(0),
boost::visitor(boost::make_bfs_visitor(
boost::record_distances(d_map, boost::on_tree_edge())
)));
cout << "Starting at 0" << endl;
for(size_t i = 0; i < 9; ++i){
//depth (level) of BFS
cout << "vertex " << i << "\t" << d.at(i) << endl;
}
vector<size_t> d2(num_vertices(G));
cout << "Starting at 4" << endl;
// Create the external property map, this map wraps the storage vector d
boost::iterator_property_map< std::vector<size_t>::iterator, VertexIndexMap >
d2_map(d2.begin(), v_index);
//start at 4
boost::breadth_first_search(G, verts.at(4),
boost::visitor(boost::make_bfs_visitor(
boost::record_distances(d2_map, boost::on_tree_edge())
)));
for(size_t i = 0; i < 9; ++i){
//depth (level) of BFS
cout << "vertex " << i << "\t" << d2.at(i) << endl;
}
}
sortie devrait ressembler à ceci:
sommets 9
bords 8
À partir de 0
sommet 0 0
sommet 1 1
sommet 2 2
sommet 3 3
sommet 4 1
sommet 5 2
sommet 6 3
sommet 7 4
sommet 8 5
partir de 4
sommet 0 0
sommet 1 0
sommet 2 0
sommet 3 0
sommet 4 0
sommet 5 1
sommet 6 2
sommet 7 3Lorsque vous commencez à 4, les autres sommets ne sont pas joignables, donc le vecteur contient des valeurs par défaut (0 dans ce cas). Cela devrait fonctionner pour non orienté aussi.
Questions connexes
- 1. Algorithme de suppression de cycle simple pour un graphe BGL
- 2. Comment utiliser un graphe orienté BGL comme un graphe non orienté (à utiliser dans un algorithme de mise en page)?
- 3. Matrices de nivellement d'usure SSD générales
- 4. Création d'un arbre de recouvrement à l'aide de BGL
- 5. Modifier la cible d'Edge dans BGL
- 6. Sortie poids BGL Edge
- 7. Comment représenter un groupe d'objets dynamiquement alloués C++ sous la forme d'un graphe BGL (Boost Graph Library) afin d'obtenir leur graphe de dépendance?
- 8. Personnalisé InputIterator for Boost graph (BGL)
- 9. Extraire un sous-graphe d'un graphe en utilisant JUNG?
- 10. [graphe]: construire un graphe de relation
- 11. algorithme de mise en œuvre à l'aide Dijkstra graphique BGL
- 12. Boost (BGL): Comment désobéir mes erreurs?
- 13. Problème d'accès en lecture simultanée BGL
- 14. BGL Propriétés groupées add_edge "aucune fonction correspondante"
- 15. Propriétés personnalisées pour les arêtes dans le BGL
- 16. Trouver le sommet BGL de Boost par une clé
- 17. rrdtool graphe légèrement différent graphe
- 18. BGL DSF à partir d'un ensemble de nœuds de source
- 19. vis.js test de graphe de réseau en utilisant le sélénium
- 20. Localisation de graphe ouvert
- 21. BGL depth_first_search erreur avec la carte de couleur
- 22. API de recherche de graphe et de graphe Java
- 23. Codage en grappes Matlab - graphe de dispersion de graphe
- 24. Répertoire de graphe acyclique et répertoire de graphe général
- 25. Comment créer un graphe récursif (graphe)?
- 26. graphe web pour un ensemble de sites utilisant python
- 27. comparer la structure de graphe en utilisant java
- 28. Trouver MST du graphe orienté en utilisant l'algorithme de Prim
- 29. Générer un graphe de distribution normale en utilisant C#
- 30. Algorithme de sous-graphe
Vous êtes déjà à mi-chemin; vous avez la base algorithmique pour le faire, juste besoin du code. Malheureusement, ce site n'est pas pour amener d'autres personnes à écrire du code. Vous devriez nous montrer ce que vous avez essayé et ensuite nous pouvons vous aider à surmonter les obstacles. –
Le graphique est-il acyclique? Si c'est le cas, vous pouvez regarder 'libs/graph/test/dag_longest_paths.cpp' dans l'arborescence des sources Boost pour un exemple qui semble faire ce que vous voulez. –