在BOOST图中找到给定2个顶点的多个边

时间:2014-01-19 06:57:35

标签: c++ boost graph boost-graph

我正在为某个项目使用Boost Graph库,我想查找在图中重复边的次数。例如,

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Node_Info, Edge_Info > Graph_t;  
//node_info and Edge_info are external node and edge properties (structures)

假设我有两个节点,node1和node2,它们之间有一条边(node1,node2)。每个边的edge属性包含一个时间戳start,end ..并且图中可能有许多这样的边具有不同的时间戳。例如。

edge1 = (node1, node2) with start = 100, end = 200.
edge2 = (node1, node2) with start = 250, end = 400.

我知道在增强图中,给定两个顶点,我们可以使用以下内容查找图中是否存在边。

std::pair < edge_t, bool > p = boost::edge( node1, node2, myGraph );
if(p.second == 1)  cout << "edge exists!" << endl;
else cout << " does not exist " << endl;

但这可能意味着即使存在具有不同边缘属性的多个边缘,它也只会返回任何一个边缘 - &gt;问题

任何人都可以建议如何在两个给定节点之间获得这样的多边?谢谢!

1 个答案:

答案 0 :(得分:7)

有几种方法可以做到这一点。

1)只需检查所有转到所需目标的边缘:

boost::graph_traits<Graph_t>::out_edge_iterator ei, ei_end;
boost::tie(ei, ei_end) = out_edges( node1, myGraph );
int parallel_count = 0;
for( ; ei != ei_end; ++ei) {
  if( target(*ei, myGraph) == node2 ) {
    cout << "Found edge (node1, node2) with property: " << myGraph[*ei] << endl;
    ++parallel_count;
  };
};
cout << "There are a total of " << parallel_count << " parallel edges." << endl;

2)指定boost::multisetS作为OutEdgeListS的{​​{1}}模板参数,这将启用一个名为adjacency_list的额外函数,它返回所有&#的迭代器范围34;并行&#34;边缘来自edge_range并进入u,如documentation page所述:

v
     

返回一对外边迭代器,它们给出从u到v的所有并行边的范围。只有当adjacency_list的OutEdgeList是根据目标顶点对外边缘进行排序的容器时,此函数才有效,并且允许对于平行边缘。 multisetS选择器选择这样一个容器。

此函数仅适用于std::pair<out_edge_iterator, out_edge_iterator> edge_range(vertex_descriptor u, vertex_descriptor v, const adjacency_list& g) 的原因是因为为了向平行边提供(容易)一系列迭代器,您需要将边组合在一起,这是{{{ 1}}因为它们按顶点描述符排序,因此所有平行的外边缘都被组合在一起。这是唯一能为您提供选择的容器选择,否则,您必须使用选项(1)(注意:创建multisetS(请参阅docs)如果真的可以派上用场经常使用这个。)