- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Boost.Graph 处理有向图(实际上是双向图)。我想使用现有的布局算法(Kamada-Kawai 或 Fruchterman-Reingold),但它们只接受无向图作为参数。
使用这些布局算法的最简单方法是什么?更一般地说,引诱算法认为有向图实际上是无向图的正确方法是什么?
谢谢,贝努瓦
最佳答案
您确定 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);
关于c++ - 如何将 BGL 有向图用作无向图(用于布局算法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552854/
我想使用并行 MST 算法 dense_boruvka_minimum_spanning_tree从 boost 。 该算法接口(interface)的一个必需参数是“必须是顶点列表图和分布式边列表图
这个问题是关于Boost Graph Library的。 假设我的图形类型定义如下: using Graph = boost::adjacency_list; 现在,如果我理解正确的话,可以将新的St
我似乎无法弄清楚如何让 BGL 的推送重新标记最大流量算法与捆绑属性一起使用。 像这样设置图表: struct VertexProperties{ }; struct EdgeProperties{
我想用子图实现加权无向图。这是我对该图的初始化代码: #include #include typedef boost::property EdgeWeightProperty; typedef b
下面是一些使用 bgl 创建图形并遍历顶点的示例代码。我想以随机顺序进行此迭代 - 换句话说:循环应该操纵每个顶点,但是对于主函数的每次调用,顶点的顺序应该是随机的。我怎样才能做到这一点? 我用 st
我正在尝试通过编写自定义 DFS 访问器(class TarjanVisitor : public default_dfs_visitor)在 BGL 中实现桥接检测算法 (tarjan),并且我正在
我开始使用 BGL 来完成一些与图形相关的任务。我有很多边,每条边都有几个属性,其中之一就是它的权重。 (所有属性都是 float 和整数)。由于我以前从未使用过 BGL(和/或类似的 CPP 库),
我想让所有边都具有属性、重量和容量。我发现 BGL 已经定义了这些。所以我为图定义了 Edge 和 Vertex 属性 typedef property VertexProperty; typed
我的要求是有一个图形结构,其中每个顶点都由 boost::uuids::uuid 唯一标识。 .所有顶点都有一个颜色属性,相似类别的顶点将根据该颜色属性进行分组。我不是在静态 map 上工作,顶点和边
我正在努力从我的图中删除所有没有连接边的节点(使用定义的模式 here )。到目前为止,我的 (MWE) 代码如下: //g++ -O3 question.cpp -o question.exe #i
我是 BGL( boost 图形库)的新手。我正在学习breadth_first_search 界面,它看起来很方便。但是,在我的应用程序中,当满足其他一些终止条件(例如搜索空间节点数满足最大值)时,
借鉴this回复,我试过如下实现介数中心性: typedef struct vpr_ { int id; } VProp; typedef boost::adjacency_l
我尝试使用boost的transitive_reduction,但是我不知道怎么用。 我有一个图表定义为: typedef boost::adjacency_list Graph; typedef G
我想知道是否有一种方法可以在不使用 lambda 函数的情况下获得 boost 图边缘的排序 vector 。 即我目前正在这样排序: std::vector edgs = ...; std::sor
在 bgl iteration_makros.hpp , 它说 Use the _T versions when the graph type is a template parameter or d
所以我目前正在研究一个单词阶梯问题的项目,我已经构建了用于在其中存储所有字典单词的图形并在其中添加了边,我使用 boost 图形库完成了此操作。 但令我困惑的是 breadth_first_searc
我想在检查边缘时更改边缘权重,但它告诉 error: assignment of member ‘EdgeProperty::weight’ in read-only object g[e].weig
Example code来自 BGL: breadth_first_search(g, vertex(s, g), color_map(get(&VertexProps::color, g)).vis
我正在阅读某人的代码。这是来自 boost 图形库的函数。这是原始函数定义。 void dijkstra_shortest_paths (const Graph& g, t
我希望多线程使用BGL的dijkstra_shortest_paths和astar_search函数,然后读取结果顶点和边的属性映射。 我想知道我是否应该使用互斥锁来确保线程安全。 所以这是我的问题:
我是一名优秀的程序员,十分优秀!