Joh*_*nes 5 c++ boost graph boost-graph
最小的例子:
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
struct vertex
{
int number;
};
struct edge {};
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, vertex, edge> graph_t;
typedef boost::graph_traits<graph_t>::vertex_descriptor vertex_t;
typedef boost::graph_traits<graph_t>::edge_descriptor edge_t;
struct vertex_visitor : public boost::default_dfs_visitor
{
void discover_vertex(vertex_t v, graph_t& g)
{
g[v].number = 42;
}
};
int main()
{
graph_t g;
vertex_t v1 = boost::add_vertex(g);
vertex_t v2 = boost::add_vertex(g);
boost::add_edge(v1, v2, g);
vertex_visitor vis;
boost::depth_first_search(g, boost::visitor(vis));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为图形需要像const在中一样被引用vertex_visitor::discover_vertex().
有没有比编写我自己的DFS算法(或使用const_cast)更好的方法来做我想做的事情?此外,您的解决方案是否允许在发现顶点时添加/删除边和顶点?
看看Boost如何实现connected_components.为了存储组件ID,使用以下访问者:
// This visitor is used both in the connected_components algorithm
// and in the kosaraju strong components algorithm during the
// second DFS traversal.
template <class ComponentsMap>
class components_recorder : public dfs_visitor<>
{
typedef typename property_traits<ComponentsMap>::value_type comp_type;
public:
components_recorder(ComponentsMap c,
comp_type& c_count)
: m_component(c), m_count(c_count) {}
template <class Vertex, class Graph>
void start_vertex(Vertex, Graph&) {
if (m_count == (std::numeric_limits<comp_type>::max)())
m_count = 0; // start counting components at zero
else
++m_count;
}
template <class Vertex, class Graph>
void discover_vertex(Vertex u, Graph&) {
put(m_component, u, m_count);
}
protected:
ComponentsMap m_component;
comp_type& m_count;
};
Run Code Online (Sandbox Code Playgroud)
我们的想法是将属性映射传递给访问者的构造函数,稍后用于更新数据.关于您的示例,vertex_visitor可以通过以下方式重写:
template <class PropertyMap>
struct vertex_visitor : public boost::dfs_visitor<>
{
PropertyMap m_pmap;
vertex_visitor(PropertyMap pmap) : m_pmap(pmap) {}
template <class Vertex, class Graph>
void discover_vertex(Vertex v, const Graph& g)
{
boost::put(m_pmap, v, 42);
}
};
Run Code Online (Sandbox Code Playgroud)
这个访问者的实例化有点令人费解,因为我们需要明确指定属性映射类型:
typedef boost::property_map<graph_t, int vertex::*>::type NumbersProperty;
vertex_visitor<NumbersProperty> vis(boost::get(&vertex::number, g));
Run Code Online (Sandbox Code Playgroud)
根据问题的最后部分,图结构的变异(即顶点和边的添加或删除)使整数器无效,因此这将破坏DFS算法.我认为这正是图表通过const-reference传递的原因.
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |