比较Boost Graph Library创建的2个图表

时间:2009-08-05 14:27:21

标签: c++ boost

这可能是一个相当新手甚至是错误的问题所以请原谅。有没有办法比较使用Boost Graph Library创建的2个图表=>在内存中创建了1个图表,从存档中加载了第2个图表(即先前已将第2个序列化)?

我没有在BGL的文档中看到运算符==,但不确定这是否意味着我必须同时编写遍历和比较。任何指向教程,参考页面或样本的指针都是最有帮助的

提前致谢 内甚

2 个答案:

答案 0 :(得分:6)

Boost.Graph可以执行此操作,但不能使用==运算符:http://www.boost.org/doc/libs/1_39_0/libs/graph/doc/isomorphism.html

这是一个难题,所以大型图表需要很长时间。

答案 1 :(得分:5)

在一般情况下,Graph Equality是一个在多项式时间内不易处理的问题;实际上,这意味着在合理的时间内解决它可能是有效的(尽管不知道是NP - 完整)。但是,如果你担心顶点标签也是相同的,那么迭代两个图中的所有边都是足够的,并确保每个边都在另一个图中。

编辑:如果顶点标签(与每个顶点相关联的值)在两个图上都相同,并且是唯一且可比的,我们可以检查O中的同构(V lg V + E lg E )很容易,就像这样:

If |G1| != |G2|, the graphs are non-equal. Abort.

i = 0
For each vertex V in G1:
  G1_M[Label(V)] = V
  G1_I[V] = i
  i = i + 1

For each vertex V in G1:
  G1_E[V] = sort(map(λDestination -> G1_I[Destination]) Edges[V])

For each vertex V in G2:
  If G1_M[Label(V)] does not exist, the graphs are non-equal. Abort.
  G2_corresp[V] = G1_M[Label(V)]
  G2_I[V] = G1_I[G2_corresp[V]]

For each vertex V in G2:
  G1_E[V] = sort(map(λDestination -> G2_I[Destination]) Edges[V])
  Compare G1_E[G2_corresp[V]] and G2_E[V]. If non-equal, the graphs are non-equal. Abort.

If we get here, the graphs are equal.