Boost Graph:测试两个顶点是否相邻

Boost Graph : Test if two vertices are adjacent

我是使用 C++ boost 库的新手,尤其是 boost 图形库,需要尝试编写一些算法,我通常会在这些算法中检查两个顶点的邻接性并处理其他图形概念,例如计算图形不变量。 我所知道的是,我们可以使用以下函数遍历相邻顶点:adjacent_vertices(u, g) 但我正在寻找一种有效的方法来测试两个顶点 u、v 是否相邻而不进行线性搜索

BGL 是一个高度通用的库。您可以调整大多数数据结构以与其算法一起使用。

您可以改变边缘容器。你没有提到它,但我假设你一直在寻找 boost::adjacency_list.

的 interface/complexity 保证

事实上,边缘成员测试将是 O(n),即使您使用 setS 作为边缘容器 selector。这主要是因为邻接列表存储传出边是每个顶点。所以在最坏的情况下,每个顶点最多包含一个出边,搜索实际上是 O(n) [1]

在这种情况下,您只想 select 另一个图形实现。

Graph Concepts 上的文档页面是了解预期概念的良好起点。还有,哪些模型提供了这些概念。

在最坏的情况下,您可以调整数据结构以用于 Boost Graph 算法。例如。您可以将所有边存储在一个简单的 std::[unordered_]set<std::pair<VID, VID> > 中,并使其适应 EdgeListGraph 概念的模型。

这样你就会有高效的查找。


[1] 当然,这也意味着,在最好的情况下,搜索是您的设置实现所提供的任何内容:O(log n) 因为所有边都可能来自同一个顶点...

AdjacencyMatrix 概念给出了一个复杂性保证,即 edge() 函数必须 return 在常数时间内。

要检查两个顶点 vwG 中是否相邻,您可以编写 edge(v, w, G).second,因为函数 return 是一对,其中第二个值表示边是否存在。

edge() 功能也适用于其他图形表示。这是一张图表,显示了不同表示在检查顶点邻接性方面的性能比较:

这是该图的 code used to generate the data。每个数据点是 100 个中等密度的随机图,每个图有 100 个随机边检查。注意对数 y 轴。

什么是最佳选择最终将取决于您的特定应用程序,因为对于其他操作,结构按速度排序是不同的。换句话说,避免过早优化。