繁体   English   中英

BGL 无向图出边迭代器源/目标

[英]BGL Undirected Graph Out-Edge Iterator Source/Target

我有以下无向BGL 图描述:

typedef boost::adjacency_list<boost::setS, boost::listS, boost::undirectedS, VProp, EProp> Graph;

在我的代码中,我使用以下循环来访问给定节点v的外边缘:

  OutEdgeIter out_i;
  OutEdgeIter out_end;

  for (boost::tie(out_i, out_end) = out_edges(v, g);  out_i != out_end; ++out_i)
  {
    Edge curEdge = *out_i;
    Vertex curNeighbor = boost::target(curEdge, g);

    // Other stuff here.
  }

我注意到以这种方式获得的任何节点v都有一个特殊的属性:该节点的target将始终是v的邻居,而source将始终是v本身。 这在有向图的情况下当然是有意义的,但我的图是无向的,如前所述。 目前尚不清楚(仅从定义的角度来看)无向边的目标来源是什么。

上述是否是 BGL 的书面保证财产? 我已经编写了一些依赖于这个属性的单元测试并且它们都通过了,但是我在 BGL 文档中找不到这个让我很烦恼(或者我可能只是很不擅长阅读它们)。

(顺便说一句,在设置边缘属性时,边缘的“方向”似乎并不重要。将(u, v)的权重设置为 5 会导致boost::edge(v, u, g)的权重也返回五个:似乎仍然只有一个底层边缘 object。)

以上是 BGL 的书面保证财产吗

是的。 我不太确定它会被记录在案,但我已经看到代码将 arguments 的顺序交换为 add_edge 的顺序。

请注意,这在概念上是有道理的:如果您记得邻接列表是……邻接列表,并且它们是按源顶点存储的,那么当从顶点 v 迭代邻接时,您将得到一个列表,这很有意义相邻顶点(目标)的集合,并且在迭代 out_edges 时,总是将边缘合成为每个相邻目标的(源,目标)是有意义的。

是我所知道的最相关的文档

BGL 提供的用于访问和操作无向图的接口与以下部分中描述的有向图接口相同,但是在行为和语义上存在一些差异。 例如,在有向图中,我们可以讨论顶点的出边和入边。 在无向图中,没有in'' and出”,只有与顶点相关的边。 尽管如此,在 BGL 中,我们仍然使用 out_edges() function(或 in_edges())来访问无向图中的事件边。 类似地,无向边没有source'' and目标'',只有一对无序的顶点,但在 BGL 中我们仍然使用 source() 和 target() 来访问这些顶点。 BGL 没有为无向图提供单独的接口的原因是有向图上的许多算法也适用于无向图,并且仅仅因为接口的差异而不得不复制算法会很不方便。 使用无向图时,只需在心里忽略 function 名称中的方向性。 下面的示例演示了将 out_edges()、source() 和 target() 与无向图一起使用。 此示例和以下示例的源代码可以在 example/undirected_adjacency_list.cpp 中找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM