问题标签 [boost-graph]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2631 浏览

c++ - 在类模板外部或内部定义的结构

我定义了一个简单的模板类。在这个类中,我定义了一个用于图节点的结构(struct NodeData)。对于我在下面给出的第一个代码,即使我在方法测试中故意犯了错误,也没有编译错误(g[nId].anything = "something"即使 struct NodeData 没有名为任何变量的变量)。

为了理解问题出在哪里,在下面给出的第二个代码中,我将结构定义和 typedef 放在了 MyClass 之外。我已经把template<typename T1, typename T2>结构 NodeData 的定义放在了上面,因为这个结构需要存储 2 个抽象类型 T1 和 T2 的变量。我还typename从 typedefs 中删除了关键字,并且我在第一个 typedef 中放置NodeData<int, int>了而不是NodeData(即使我实际上不想这样做),否则它会在这一行出现一些错误,例如:expected a type, got 'NodeData'. 当我编译时,它给出了以下预期的错误(这实际上是完全正常的):,'struct NodeData<int, int>' has no member named 'anything'而对于第一个代码我没有得到这个错误!

这两个代码有什么区别?如何使第二个代码不必为第一个 typedef 指定 NodeData(因为 struct NodeData 的成员 var1 和 var2 不一定是 int 类型)?或者我怎样才能让第一个代码正常工作并检测 NodeData has no member named 的错误anything

第一个代码:

第二个代码:

0 投票
1 回答
959 浏览

c++ - 如何遍历有向图中的所有边并获取源+目标

我在有向图中添加了一堆节点和顶点,使用设置 typedef 创建boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, Node, Edge> graph;

Node有一个字符串作为节点的名称,并Edge有一个 int 作为它的分数。我正在尝试遍历所有边缘并输出源名称和目标名称,以及该边缘的分数。

您可以使用 获取边缘上的迭代器,该迭代器my_graph.m_edges.begin()可以取消引用以获取m_sourcem_target

如何获得分配给源节点和目标节点的名称,以及该边缘上的分数?

0 投票
1 回答
440 浏览

boost - BGL edge(u, v, g) 与边缘列表的自定义关联容器

我刚刚开始学习 bgl,并且在使用具有自定义排序的 std::set 作为 adjacency_list 中边缘列表的容器时遇到了问题。我定义 operator< 以根据边缘的属性对边缘进行排序,就像在 ordered_out_edges.cpp 示例中一样。这里 boost::edge_unique_ordering 是一个自定义属性标签。

一般来说它工作正常,但是当我使用 edge(u, v, g) 函数时,我得到了迭代器异常。如果我用解决方法替换这些调用以避免(源,目标)请求边缘,那么一切正常。

我查看了 boost 代码,我很确定我知道原因是什么,我只是不确定这是否意味着我做错了什么,这是 boost 代码的问题,或者只是一个未记录的不兼容性。该函数在 u 的外边列表容器上调用 set::find(StoredEdge(v))。现在默认的 stored_edge::operator< 只是比较目标顶点,但在我的情况下,我的自定义 operator< 被调用,并且正在寻找的 StoredEdge(v) 显然是默认初始化的,没有属性,这可能是导致问题。在我看来, edge(u, v, g) 应该严格根据目标顶点搜索任何匹配项,而不管容器内的边缘采用什么顺序。

任何人都可以阐明我可能做错了什么或不理解吗?

0 投票
1 回答
4054 浏览

c++ - 将图 (adjacency_list) 复制到另一个

如何将 adjacency_list 类型的图复制到 adjacency_list 类型的另一个图?

0 投票
2 回答
1584 浏览

visual-studio-2010 - 在 msvc 2010 中构建 boost MPI 时出错

我已经在 C:\Program Files\OpenMPI_v1.5.4-win32\ 中安装了 openmpi,并希望编译 boost 以生成图形并行库。但出现以下错误:

当我在 Visual Studio 2010 命令提示符下运行时:

我在 boost_1_48_0\tools\build\v2\user-config.jam 中添加了 MPI 配置,如下所示:

我相信以前有人问过这个类似的问题,但没有得到答案:

如何使用 Visual Studio 2010 在 Windows 上使用 Open MPI 构建 boost::mpi 库

0 投票
0 回答
55 浏览

c++ - BGL 的运行时测试

BGL 为他们的图概念提供了概念检查,似乎标题boost/graph/graph_test.hpp为给定的概念提供了某种运行时检查,但它UNDER CONSTRUCTION从 2002 年开始就有这种可怕的东西。

是否有其他适用于 BGL 的运行时测试套件,或者是否可以安全使用(以及如何使用)graph_test.hpp

0 投票
0 回答
5520 浏览

boost - 使用boost图库检测无向图中的循环

从昨天开始我就被这个问题困住了。不幸/幸运的是,这个问题只占我的超级巨大(对我来说,一个 c++ 新手)算法的 0.5%,因此需要一个现有代码库,一个人可以适应并让事情正常工作。

我想检测并给出无向图中的所有圆圈。我的边缘没有加权。是的,我真正需要的是所有循环,即类似于有向图的所有哈密顿循环

我一直在玩 boost 图形库,DFS 算法似乎很有前途,但是,它只访问顶点一次,因此不能给出所有的哈密顿圆。

目前,我只需要代码工作,这样我就可以继续我的算法设计,之后我可能会考虑性能问题。甚至欢迎使用 5 嵌套 for 循环的解决方案。

这是我从 boost 中获得并使用的代码,但我不知道如何记录和访问我的 back_edges 前辈,即使解决了,boost DFS 也只会访问一次顶点:

上面的例子说通常只有 3 个循环,我预计会超过 4 个,单个顶点可能会出现在多个循环中。其次,我什至无法back_edge()像这样访问 boost 给我的所有三个周期std::vector<uInt32> fCycle1, fCycle2,fCycle3。我得到back_edge()的只是源顶点和目标顶点。

我将不胜感激任何帮助和提示。到目前为止,这里的所有示例都只是检测循环的存在或其数量,但没有一个示例显示如何列出所有存在的循环。

0 投票
1 回答
916 浏览

c++ - 使用 write_graphviz() 打印一个 constified 子图

我正在努力将图表转储到流中,其中所述图表是boost::subgraph.

我尝试提供一个属性编写器,但基本上它失败了,因为它似乎需要一个方法boost::get(PropertyWriter, VertexDescriptor)。在图表subgraph符合预期的情况下使用相同的方法。

发现here,我必须使用a boost::dynamic_properties(见下面的代码),但当我的图表不可写时它会失败(而文档表明该图表被视为一个约束参考)。

这是一个我无法开始工作的简单示例:

欢迎任何提示!非常感谢,


编辑

我忘了提及在我的案例中“失败”是什么意思;这是我尝试编译时的错误:

错误:将 'const std::basic_string' 作为 'std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string <_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string]' 丢弃限定符 [ -fpermissive]

0 投票
3 回答
2557 浏览

boost-graph - LEDA 图形 v/s Boost 图形库

我想要效率,如果效率(=0.9*speed + 0.1*others)高,我愿意自己写代码。如果我要在 LEDA 图或 Boost 图之间进行选择,我应该选择哪一个?

我的算法很耗时(有些甚至是时间上的非多项式),适用于大图。

0 投票
1 回答
892 浏览

c++ - Boost:: Dijkstra Shortest Path,如何从路径迭代器中获取顶点索引?

在你开始阅读之前,为了帮助你理解我的问题,我告诉你我已经从这个链接复制了代码:Dijkstra Shortest Path with VertexList = ListS in boost graph

所以..我正在重写我的程序代码以使用 boost,但现在当 99% 准备好时,我被我的 GPS 卡住了(用于游戏)。我有一个节点列表,幸运的是,我以一种很容易转换为 boost 方法的方式添加了这些节点。我需要做的就是创建一个这样的顶点变量:

我从我给出的链接中复制了 typedef。

我添加顶点的方式是这样的:

其中“i”等于一个整数。(例如int i = 9)

并且 eges 也很容易添加。现在,我有自己的结构化数组,称为“xNode”。例如: xNode[i] 保存节点的 XYZ 位置(xNode[i].X xNode[i].Y 等)的所有信息。

现在,当使用链接中的代码片段时,我已经这样做了:

这就是我卡住的地方,为“source(*pathIterator, dgraph)”和“target(*pathIterator, dgraph)”获取地址,但我需要顶点索引来访问xNode[i],i是NodeID(或以及顶点 ID | Vx[i])。我怎样才能做到这一点?


编辑:我试图做:

但这只是崩溃..