我正在为某个项目使用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;问题
任何人都可以建议如何在两个给定节点之间获得这样的多边?谢谢!
答案 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)如果真的可以派上用场经常使用这个。)