Я ищу способ объединить несколько графов в один граф, используя ЛИМОН. Если это не может быть сделано, я также был бы заинтересован в решениях, использующих Boost Graph Library.
В качестве фона я хочу определить более мелкие структурные единицы в виде графиков, пометить их свойствами и добавить несколько копий вместе для создания более сложных структур.
В приведенном ниже примере у меня есть 3 графика g1
,g2
, а также g3
состоящий из одной вершины. Я хочу объединить их в один граф и иметь возможность добавлять ребра, чтобы соединить вершины внутри результирующего графа. Тем не менее, я не знаю, как указать copyGraph
функционировать правильно, чтобы все вершины g1
, g2
, а также g3
в конечном итоге на том же графике в конце. Кроме того, если g1
и т. д. содержит несколько связанных вершин, эти ребра должны оставаться неизменными.
Пример также содержит четвертый график 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;
}
Задача ещё не решена.
Других решений пока нет …