C++ 如何使用LEMON(或BGL)组合/合并多个图形

C++ 如何使用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等包含多个连接的顶点,则这些边应保持完整 该示例还包

我正在寻找一种方法来合并成一个单一的图形使用多个图形。如果做不到,我也会对使用的解决方案感兴趣

背景是,我想将较小的结构单元定义为图形,用属性对它们进行注释,并将它们的多个副本添加到一起,以创建更复杂的结构

在下面的示例中,我有3个图g1、g2。g3由一个顶点组成。我想将它们组合成一个图,并能够添加边来连接结果图中的顶点。但是,我不知道如何正确地指定copyGraph函数,以便g1、g2和g3的所有顶点最终都位于同一个图形的末尾。此外,如果g1等包含多个连接的顶点,则这些边应保持完整

该示例还包含第四个图形gTest,它看起来像我想要实现的结果。然而,这里的gTest是从头开始创建的,而不是通过组合以前存在的图来创建的。这是为了演示/澄清,并生成以下图形:

要使用g++编译代码,请使用

g++-lemon main.cpp


我不确定你的具体问题是什么。看起来你已经完成了你的目标。显示的结果只是我想要实现的结果的一个演示。对于演示,我从头创建了结果。我正在寻找的是一种通过组合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;
}