C++ 如何将BGL有向图用作无向图(用于布局算法)?

C++ 如何将BGL有向图用作无向图(用于布局算法)?,c++,boost,boost-graph,C++,Boost,Boost Graph,我正在使用Boost.graph处理一个有向图(实际上是双向图)。我想使用现有的布局算法(Kamada Kawai或Fruchterman Reingold),但它们只接受无向图作为参数 使用这些布局算法的最简单方法是什么? 更一般地说,什么是诱使算法认为有向图实际上是无向的正确方法 谢谢, Benoît你确定Fruchterman-Reingold算法只接受无向图吗?我尝试使用双向图而不是无向图来运行这个小示例,它编译后运行良好 为了回答您的问题,我不确定BGL中是否内置了将有向图转换为无向

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

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

谢谢,
Benoît

你确定Fruchterman-Reingold算法只接受无向图吗?我尝试使用双向图而不是无向图来运行这个小示例,它编译后运行良好


为了回答您的问题,我不确定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);
}

您使用的是哪种表示法?邻接矩阵,邻接列表…?我使用的是邻接列表文档中说它不是为这个设计的,但我想我应该试试!尽管如此,我仍然对答案感兴趣,因为这种需求可能会在短期内恢复。这也是我想到的。我只是希望会有某种适配器。无论如何一旦您使用了复制图,我会将您的答案标记为“已接受”:)您是对的,我完全错过了这个功能!我编辑了我的答案,将其包括在内。
#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);