C++ 如何使用LEMON(或BGL)组合/合并多个图形
我正在寻找一种方法来合并成一个单一的图形使用多个图形。如果做不到,我也会对使用的解决方案感兴趣 背景是,我想将较小的结构单元定义为图形,用属性对它们进行注释,并将它们的多个副本添加到一起,以创建更复杂的结构 在下面的示例中,我有3个图g1、g2。g3由一个顶点组成。我想将它们组合成一个图,并能够添加边来连接结果图中的顶点。但是,我不知道如何正确地指定copyGraph函数,以便g1、g2和g3的所有顶点最终都位于同一个图形的末尾。此外,如果g1等包含多个连接的顶点,则这些边应保持完整 该示例还包含第四个图形gTest,它看起来像我想要实现的结果。然而,这里的gTest是从头开始创建的,而不是通过组合以前存在的图来创建的。这是为了演示/澄清,并生成以下图形: 要使用g++编译代码,请使用 g++-lemon main.cppC++ 如何使用LEMON(或BGL)组合/合并多个图形,c++,graph,boost-graph,lemon-graph-library,C++,Graph,Boost Graph,Lemon Graph Library,我正在寻找一种方法来合并成一个单一的图形使用多个图形。如果做不到,我也会对使用的解决方案感兴趣 背景是,我想将较小的结构单元定义为图形,用属性对它们进行注释,并将它们的多个副本添加到一起,以创建更复杂的结构 在下面的示例中,我有3个图g1、g2。g3由一个顶点组成。我想将它们组合成一个图,并能够添加边来连接结果图中的顶点。但是,我不知道如何正确地指定copyGraph函数,以便g1、g2和g3的所有顶点最终都位于同一个图形的末尾。此外,如果g1等包含多个连接的顶点,则这些边应保持完整 该示例还包
我不确定你的具体问题是什么。看起来你已经完成了你的目标。显示的结果只是我想要实现的结果的一个演示。对于演示,我从头创建了结果。我正在寻找的是一种通过组合g1、g2和g3来创建结果的方法。仅作为伪代码存在的部分。我相当肯定可以使用某种形式的复制操作来完成,但我不知道如何正确地完成
#include <lemon/list_graph.h>
#include <lemon/graph_to_eps.h>
int main()
{
using namespace lemon;
typedef dim2::Point<int> Point;
ListGraph g1;
ListGraph::NodeMap<Point> coords1(g1);
ListGraph::Node n1 = g1.addNode();
coords1[n1] = Point(10,20);
ListGraph g2;
ListGraph::NodeMap<Point> coords2(g2);
ListGraph::Node n2 = g2.addNode();
coords2[n2] = Point(20,20);
ListGraph g3;
ListGraph::NodeMap<Point> coords3(g3);
ListGraph::Node n3 = g3.addNode();
coords3[n3] = Point(15,25);
// pseudo-code of the copy-operation:
// copyGraph(g1, g3);
// copyGraph(g2, g3);
//
// g3.addEdge(n1,n3)
// g3.addEdge(n2,n3)
// Result should look similar to what the following produces
ListGraph gTest;
ListGraph::NodeMap<Point> coordsTest(gTest);
ListGraph::Node n1Test = gTest.addNode();
coordsTest[n1Test] = Point(10,20);
ListGraph::Node n2Test = gTest.addNode();
coordsTest[n2Test] = Point(20,20);
ListGraph::Node n3Test = gTest.addNode();
coordsTest[n3Test] = Point(15,25);
ListGraph::Edge e1Test = gTest.addEdge(n3Test, n1Test);
ListGraph::Edge e2Test = gTest.addEdge(n3Test, n2Test);
graphToEps(gTest, "gTest.eps")
.coords(coordsTest)
.nodeTexts(coordsTest)
.run();
return 0;
}