当前位置: 首页 > 知识库问答 >
问题:

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

王昊
2023-03-14

我正在使用Boost图库的一些项目,我想找到的次数,一个边是重复在一个图。例如,

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)。属性包含时间戳开始、结束..并且在图中可以有许多这样的边,它们具有不同的时间戳。例如。

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

我知道在一个boost图中,给定两个顶点,我们可以使用下面的方法来查找图中是否存在边。

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;

但这可能意味着即使存在具有不同边缘属性的多个边缘-->PROBLEM,它也只能返回任意一个边缘

有没有人能提出一个想法,如何在两个给定节点之间获得如此多的边?谢谢!

共有1个答案

姜智渊
2023-03-14

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

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作为matchinesy_listoutedgelists模板参数,这将启用一个名为edge_range的额外函数,该函数为从u出来并进入v的所有“并行”边返回一个迭代器范围,如文档页面所述:

std::pair<out_edge_iterator, out_edge_iterator>
edge_range(vertex_descriptor u, vertex_descriptor v,
           const adjacency_list& g)

返回一对外部边迭代器,该迭代器给出从u到v的所有平行边的范围。此函数仅在邻接列表的OutEdgeList是根据目标顶点对外部边进行排序并允许平行边的容器时才起作用。多集选择器选择这样的容器。

该函数仅对多集可用的原因是,为了(容易地)为并行边提供一系列迭代器,您需要将边分组在一起,多集就是这种情况,因为它们是按顶点描述符排序的,因此,所有并行外边都被分组在一起。这是唯一的容器选择,否则,您必须使用选项(1)(注意:如果您经常使用filter_iterator(请参阅文档),那么创建一个filter_iterator(请参阅文档)就会派上用场)。

 类似资料:
  • 我试图通过在MST中添加新顶点来更新MST。为此,我一直在关注Chin和Houck的“更新生成树”。http://www.computingscience.nl/docs/vakken/al/WerkC/UpdatingSpanningTrees.pdf 论文中的一个步骤要求我在两个给定顶点之间的路径中找到最大的边。我的想法是找到顶点之间所有可能的路径,然后从这些路径中找到最大的边。我一直在尝试在

  • 一个简单的背景:我正在构建一个语义图,使用带有邻接表的BGL有向图: 我需要做的事情之一,是处理一个较小的图(子图)到我的主图。 暗示我的lambda捕获参数应该是一对(我猜是一个实际的边?)。 所以,我的问题是:我怎样才能发现在顶点的外边中是否存在类似的边呢?

  • 我怎样才能找到一个有向图中的所有顶点,这样每一个顶点都可以从这个顶点到达呢?现在我只能“发明”O(v^3)ALGO--从每个顶点得到一个DFS/BFS,但我确信,有一个更快的方法来解决这个问题。 谢谢你!

  • 有没有一种算法可以高效地找到这个中心?理想情况下,性能只取决于及其周围环境,而不取决于整个图。 我考虑过从中的所有顶点同时开始广度优先搜索,当所有遇到一个顶点时停止搜索,但这并不是太高效。在这种情况下可能是可行的,但感觉可能有更好的方法。

  • 下面的堆栈溢出问题 我尝试了在语句中使用两个重复的多个构造,但无法为每个起始顶点获得独立的。我也在使用平台,因此它限制了Gremlin的使用,其中不允许使用循环/脚本。所有gremlin查询必须以并由与链接在一起的命令组成 https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.ht

  • 问题内容: 我一直试图将一堆线旋转90度(它们一起形成一条折线)。每行包含两个顶点,例如(x1,y1)和(x2,y2)。我当前要执行的操作是绕线的中心点旋转,给定中心点| x1-x2 | 和| y1-y2 |。由于某些原因(我在数学上不是很精明),我无法使线条正确旋转。 有人可以验证这里的数学是正确的吗?我认为这可能是正确的,但是,当我将线的顶点设置为新的旋转顶点时,下一行可能未从前一行抓取新的(