boost图库:dfs访问者过滤节点

时间:2016-05-06 15:40:19

标签: c++ boost graph depth-first-search

在构建基于代理的模型时,我遇到了booost图库的以下问题。 我有一个代表代理商和潜在交易的有向图,定义如下:

struct agent{
  int idhh;
  double askprice;
  double maxbid;
  bool is_seller;
  bool is_buyer;
};

typedef adjacency_list< listS, // Store out-edges of each vertex in a std::list
                       listS, // Store vertex set in a std::list
                       directedS,
                       // vertex properties
                       agent,
                       // edge properties
                       no_property
                       >
                       taGraph;

typedef graph_traits<taGraph>::vertices_size_type v_size_type;
typedef graph_traits<taGraph>::edges_size_type e_size_type;
typedef graph_traits<taGraph>::vertex_descriptor vertex_t;
typedef graph_traits<taGraph>::vertex_iterator vertex_iter;
typedef graph_traits<taGraph>::edge_descriptor edge_t;
typedef graph_traits<taGraph>::out_edge_iterator out_edge_iter;
typedef graph_traits<taGraph>::in_edge_iterator in_edge_iter;

对于此部分问题,可以忽略顶点属性。现在,对于给定的节点v,我想找到两件事之一:

  • 如果节点v不是接收器但具有边缘和边缘,我想找到涉及节点v的某些循环。

  • 如果节点v是网络中的源(即没有传入边缘),我想找到某个路径到另一个作为接收器的节点(即没有传出边缘) ,并记录该路径。

请注意,在这两种情况下,找到一条路径绝对足够,而不是全部。 (事实上​​,我们进行了详尽的搜索,但事实证明这对我们来说是不可行的。) 我认为我们使用深度优先搜索(dfs)而不是广度优先搜索,因为它可能会提供更长的路径,这在我们的案例中是可取的。 我还发现解决方案在于为dfs提供访问者。对于第一个问题,它应该检查每个examine_edge()是否边指向out起始顶点v,而在第二种情况下,边是否指向out-degree为零的节点。如果满足条件,则会抛出异常,以便不搜索完整的图形。

我已经浏览了boost网站上为dfs和dfs访问者提供的示例。我已经花了最后的夜晚了解它是如何工作的。但是如何实现这个具体案例仍然完全逃脱了我。

所以,具体问题是,因为我没有成功地正确构建访问者:访问者需要看起来像什么?

0 个答案:

没有答案