Quizás pueda brindarle un poco de orientación sobre el BGL.
La biblioteca es muy flexible. El costo de esto es que la sintaxis puede ser muy barroca, para acomodar todas las posibilidades. Sin embargo, es lo suficientemente flexible como para hacer cosas simples de manera simple.
Lamentablemente, la documentación de impulso va a todo detalle, proporcionando una descripción solo de la complejidad total, sin una pista de lo simples que pueden ser las cosas.
(. "Cualquier tecnología suficientemente avanzada es indistinguible de la magia" - Arthur C. Clarke Lo que debería haber dicho es "Cualquier tecnología avanzada, lo suficientemente mal documentado, es indistinguible de la magia)
Considere:
typedef property_map<Graph, vertex_index_t>::type IndexMap;
IndexMap index = get(vertex_index, g);
typedef graph_traits<Graph>::vertex_iterator vertex_iter;
std::pair<vertex_iter, vertex_iter> vp;
for (vp = vertices(g); vp.first != vp.second; ++vp.first) {
std::cout << index[*vp.first] << " ";
}
Así es como el "viaje rápido" sugiere que imprimir una lista de los vértices del gráfico. sin embargo, un pequeño estudio muestra que un vértice no es más que un índice de enteros, y el código se puede simplificar en gran medida a
for (int v = *vertices(g).first; v != *vertices(g).second; ++v)
std::cout << v << " ";
Quizás haya algunas cosas mágicas que no se pueden lograr con este código simplificado, pero para cada día, utilícelas de forma razonable para reducir drásticamente la sintaxis que incrusta BGL para que pueda ver lo que está codificando.
A veces la sintaxis elaborada no se puede eliminar. (O tal vez no he notado la verdad subyacente). Entonces usualmente uso una pequeña función de utilidad para encapsular la complejidad y mantenerla alejada del algoritmo en el que estoy trabajando.
Por ejemplo, a menudo necesitan para recorrer los hijos de un vértice
vector<int> getVertexChildren(int v)
{
vector<int> vc;
typedef std::pair<graph_traits<graph_t>::out_edge_iterator, graph_traits<graph_t>::out_edge_iterator> out_edge_iter_pair_t;
for(out_edge_iter_pair_t ep = out_edges(v,m_tree);
ep.first != ep.second; ++(ep.first))
{
vc.push_back(target(*ep.first, m_tree));
}
return vc;
}
#define FOR_ALL_CHILDREN(v) vector<int> vc=getVertexChildren(v); BOOST_FOR_EACH(int child, vc)
La conclusión es: seguir adelante y utilizar BGL. Se puede simplificar para hacer cosas simples, pero una vez que haya aprendido a usarlo, toda la inmensa flexibilidad estará disponible siempre que lo necesite.
Boost conocido por su calidad en general, y las interfaces BGL con GraphViz. – Clifford
@Clifford tiene razón, no subestime el poder de aprovechar GraphViz, es absolutamente increíble. – DaveParillo