0

我正在寻找一种使用LEMON将多个 Graph 合并为一个 Graph 的方法。如果做不到,我也会对使用Boost Graph Library的解决方案感兴趣。

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

在下面的示例中,我有 3 个图表g1g2. 并由g3单个顶点组成。我想将它们组合成一个图,并能够添加边来连接结果图中的顶点。但是,我不知道如何copyGraph正确指定函数,以便 、 和 的所有顶点g1最后g2g3出现在同一个图中。此外,如果g1etc. 包含多个连接的顶点,则这些边应保持完整。

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

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

g++ -lemon main.cpp

#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;
}
4

0 回答 0