【问题标题】:How to use a BGL directed graph as an undirected one (for use in layout algorithm)?如何将 BGL 有向图用作无向图(用于布局算法)?
【发布时间】:2009-02-16 10:22:40
【问题描述】:

我正在使用 Boost.Graph 处理有向图(实际上是双向图)。我想使用现有的布局算法(Kamada-Kawai 或 Fruchterman-Reingold),但它们只接受无向图作为参数。

使用这些布局算法最简单的方法是什么? 更一般地说,诱使算法认为有向图实际上是无向的正确方法是什么?

谢谢, 贝努瓦

【问题讨论】:

  • 您使用哪种表示形式?邻接矩阵,邻接列表...?
  • 我正在使用 adjacency_list

标签: c++ boost boost-graph


【解决方案1】:

您确定 Fruchterman-Reingold 算法只接受无向图吗?我尝试使用双向图而不是无向图来运行Boost documentation 中的小示例,它编译并运行得很好。


为了回答您的问题,我不确定 BGL 中是否内置了任何工具来将有向图转换为无向图。我找到的唯一解决方案是创建一个新图形并添加原始图形的所有边:

typedef adjacency_list<vecS, vecS, bidirectionalS> BidirectionalGraph;
typedef adjacency_list<setS, vecS, bidirectionalS> UndirectedGraph;
// UndirectedGraph uses a set to avoid parallel edges

BidirectionalGraph bdg;
// use bdg

// create an undirected graph with the edges of the first one
typedef graph_traits<BidirectionalGraph>::vertex_iterator vi_beg, vi_end;
tie(vbeg, vend) = vertices(bdg);

UndirectedGraph ug(std::distance(vbeg, vend));

typedef graph_traits<BidirectionalGraph>::edge_iterator ei, ei_end;

for (tie(ei, ei_end) = edges(bdg) ; ei != ei_end ; ++ei)
{
    add_edge(source(*ei,bdg), target(*ei,bdg), ug);
}

但是,我想这个解决方案在处理大图时可能会引发一些性能问题。可能有更好的方法来实现您的目标,但我不是 BGL 专家,所以我只能为您提供:-)!


正如 Benoît 在评论中指出的那样,BGL 提供了一个函数 copy_graph,它将一个图的所有顶点和边复制到另一个中。因此,上面的代码可以归结为:

#include <boost/graph/copy.hpp>

Bidirectional bdg;
// use bdg

// create an undirected graph with the vertices and edges of the first one
UndirectedGraph g;
copy_graph(bdg, g);

【讨论】:

  • 文档说它不是为此而设计的,但我想我应该尝试一下!不过,我仍然对答案感兴趣,因为这种需求可能会再次出现
  • 谢谢。这就是我想出的。我只是希望会有某种适配器。反正。一旦您使用了 copy_graph,我就会将您的答案标记为“已接受”:-)
  • 你说得对,我完全错过了这个功能!我编辑了我的答案以包含它。
猜你喜欢
  • 2016-11-06
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多