2013-09-01 3 views
0

Я изо всех сил пытаюсь реализовать простой boost :: graph. Я пытался читать всю документацию можно найти и примеры и т.д. ...пытается реализовать простой boost :: обход графа

Вот мой код (копируется из других примеров на StackOverflow)

Вершина:

class customvertex 
{ 
public: 
    double some_member; 
}; 

Посетитель :

class MyVisitor : public boost::default_dfs_visitor 
{ 
public: 
    void discover_vertex(MyGraphVertex v, const MyGraph& g) const 
    { 
     std::cout << v << std::endl; 
     return; 
    } 
}; 

ЬурейеЕ декларация:

typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::undirectedS, customvertex> MyGraph; 
typedef boost::graph_traits<MyGraph>::vertex_descriptor MyGraphVertex; 

Код, который вызывает проблему:

MyGraph theGraph; 
customvertex a; 
MyGraphVertex vert_a = boost::add_vertex(a, theGraph); 

customvertex b; 
MyGraphVertex vert_b = boost::add_vertex(b, theGraph); 

boost::add_edge(vert_a , vert_b, theGraph); 

MyVisitor vis; 
boost::depth_first_search(theGraph, boost::visitor(MyVisitor())); 

Окончательный вызов depth_first_search вызывает компилятор выкидывать ошибку каскадирования 112 строки.
понятия кажутся IncidenceGraphConcept и MultiPassInputIterator

Ключевые части кажутся:

1>  T:\boost\boost_1_47_0\boost/concept/detail/msvc.hpp(23) : while compiling class template member function 'void boost::concepts::check<Model>::failed(Model *)' 
1>  with 
1>  [ 
1>   Model=boost::SignedInteger<int> 
1>  ] 

1>  T:\boost\boost_1_47_0\boost/graph/depth_first_search.hpp(83) : see reference to function template instantiation 'void boost::function_requires<boost::concepts::IncidenceGraphConcept<G>>(Model *)' being compiled 
1>  with 
1>  [ 
1>   G=MyGraph, 
1>   Model=boost::concepts::IncidenceGraphConcept<MyGraph> 
1>  ] 
1>  T:\boost\boost_1_47_0\boost/graph/depth_first_search.hpp(202) : see reference to function template instantiation 'void boost::detail::depth_first_visit_impl<VertexListGraph,DFSVisitor,ColorMap,boost::detail::nontruth2>(const IncidenceGraph &,unsigned int,DFSVisitor &,ColorMap,TerminatorFunc)' being compiled 
1>  with 
1>  [ 
1>   VertexListGraph=MyGraph, 
1>   DFSVisitor=const MyVisitor, 
1>   ColorMap=boost::shared_array_property_map<boost::default_color_type,boost::vec_adj_list_vertex_id_map<boost::property<boost::vertex_bundle_t,customvertex>,unsigned int>>, 
1>   IncidenceGraph=MyGraph, 
1>   TerminatorFunc=boost::detail::nontruth2 
1>  ] 

Любые и все помогают оценивать. Я уверен, что я пропустил что-то простое, и я обычно могу понять это из примеров. Я думаю, что boost :: graph выглядит великолепно, идеально подходит для того, что мне нужно, но немного больше документации ...

Я достаточно опытен с программированием шаблонов, но я потратил слишком много часов на это сейчас, время попросить о помощи!

+0

вы не хотите 'повышение :: посетителя (VIS)'? –

+0

Согласно документации, ['depth_first_search'] (http://www.boost.org/libs/graph/doc/depth_first_search.html) работает только с ориентированными графами, но с использованием boost 1.54 на g ++ 4.8.1 пример с использованием фрагменты, которые вы опубликовали, работают. Существует еще один алгоритм, который должен работать, когда ваш график неориентирован: ['undirected_dfs'] (http://www.boost.org/libs/graph/doc/undirected_dfs.html). Поэтому, возможно, вам стоит попытаться выяснить, работает ли это в вашей версии Visual Studio. – llonesmiz

+0

@Guy Sirton: да, да, это всего лишь фрагмент из меня, который очень часто возится с кодом –

ответ

0

От this GitHub я скопировал подобную работу (и испытания) Пример:

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graphviz.hpp> 
#include <boost/graph/visitors.hpp> 
#include <boost/graph/depth_first_search.hpp> 

struct Node 
{ 
    Node(const int t = 0) : m_t{t} {} 
    int m_t; 
}; 

/// A phylogeny is a graph of Node of different generations 
/// connected by ancestry 
using phylogeny = boost::adjacency_list< 
    boost::vecS, 
    boost::vecS, 
    boost::undirectedS, 
    Node 
>; 

using phylogeny_vd = boost::graph_traits<phylogeny>::vertex_descriptor; 

class my_visitor : public boost::default_dfs_visitor 
{ 
public: 
    void discover_vertex(phylogeny_vd vd, const phylogeny& g) const 
    { 
    std::cout << g[vd].m_t << std::endl; 
    } 
}; 

//Create a phylogeny 
// 
//  b---c---d 
//  | 
// a---+ 
//  | 
//  e---f---g 
// 
// ---+---+---+---+--- 
// 0 1 2 3 t (generation) 
phylogeny create_phylogeny() 
{ 
    phylogeny p; 
    const auto a = boost::add_vertex(Node(0), p); 
    const auto b = boost::add_vertex(Node(1), p); 
    const auto c = boost::add_vertex(Node(2), p); 
    const auto d = boost::add_vertex(Node(3), p); 
    const auto e = boost::add_vertex(Node(1), p); 
    const auto f = boost::add_vertex(Node(2), p); 
    const auto g = boost::add_vertex(Node(3), p); 
    boost::add_edge(a, b, p); 
    boost::add_edge(b, c, p); 
    boost::add_edge(c, d, p); 
    boost::add_edge(a, e, p); 
    boost::add_edge(f, g, p); 
    return p; 
} 

int main() 
{ 
    const phylogeny p = create_phylogeny(); 
    my_visitor v; 
    boost::depth_first_search(
    p, 
    boost::visitor(v) 
); 
} 
Смежные вопросы