2012-04-17 5 views
2

Из того, что я могу собрать как использовать BGL для того, чтобы вызвать ДФС графа из известного корневого узла, мне нужно сделать что-то вдоль линийC++ Boost graph library: Построение вектора вершин, посещенных в неориентированном поиске графа?

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

}; 


void bfsMethod(Graph g, int rootNodeId) 
{ 

    boost::undirected_dfs(g, vertex(rootNodeId,g), boost::visitor(vis)); 

} 

Теперь я не знаю, как я изменить это так, что std::vector из vertexId (или указателей) строится, поскольку DFS посещает все вершины на графике аналогично тому, как можно использовать алгоритм минимального связующего дерева, например

std::vector <JPEdge> spanning_tree; 
kruskal_minimum_spanning_tree(g, std::back_inserter(spanning_tree)); 

ответ

1

Вектор должен быть вашим посетителем. В функции discover_vertex просто нажмите обнаруженный элемент в вектор.

class MyVisitor : public boost::default_dfs_visitor 
{ 
    public: 
    void discover_vertex(MyVertex v, const MyGraph& g) const 
{ 
    cerr << v << endl; 
    vv.push_back(v); 
    return; 
} 

    vector<MyVertex> GetVector() const {return vv; } 

private: 
vector<MyVertex> vv; 

}; 

void bfsMethod(Graph g, int rootNodeId) 
{ 
    MyVisitor vis; 
    boost::undirected_dfs(g, vertex(rootNodeId,g), vis); 
    vector<MyVertex> vctr = vis.GetVector(); 

} 
+0

Спасибо, что я подозревал, но тогда как я вызываю boost :: undirected_dfs/retrieve вектор MyVertex? Просто общедоступный метод getVV в MyVisitor или есть ли более интересный способ в аналогичном ключе к крускальному звонку? – oracle3001

+0

@ oracle3001: см. Мое обновление –

+0

Спасибо за помощь – oracle3001