Используя OGDF, я создал и инициализировал PQTree. Инициализация была сделана с 3 ребрами, где узел a является корнем, b, c и d являются листьями a. Теперь, после расчета, мне нужно добавить листья e, d и f в качестве листьев. Но проблема в том, что б — это лист, поэтому не принимает ни детей, ни листьев. Код здесь. Как и std :: cout, я получил, что они были добавлены, но если я запишу его в файл GML, используя writeGML, нет никакой разницы между до и после добавления узлов, они не находятся в дереве. Я думаю, это из-за PQLeafKey, где для неконечных ребер / узлов это должен быть PQNodeKey. Согласно документации, ablk-> nodePointer () должен возвращать PQLeaf, который получен из PQNode и не «совместим» с PQInternelNode, который также является производным от PQNode. Но я не знаю, как добавить по-другому. Код:
G = new Graph();
GA = new GraphAttributes(*G, GraphAttributes::nodeGraphics |
GraphAttributes::edgeGraphics |
GraphAttributes::nodeStyle |
GraphAttributes::nodeId |
GraphAttributes::edgeType |
GraphAttributes::edgeArrow |
GraphAttributes::edgeStyle);
node a = G->newNode();
node b = G->newNode();
node c = G->newNode();
node d = G->newNode();
edge ab = G->newEdge(a, b);
edge ac = G->newEdge(a, c);
edge ad = G->newEdge(a, d);
PQLeafKey<edge, IndInfo *, bool> *ablk = new PQLeafKey<edge, IndInfo *, bool>(ab);
PQLeafKey<edge, IndInfo *, bool> *aclk = new PQLeafKey<edge, IndInfo *, bool>(ac);
PQLeafKey<edge, IndInfo *, bool> *adlk = new PQLeafKey<edge, IndInfo *, bool>(ad);
SListPure<PQLeafKey<edge, IndInfo *, bool> *> *lkl = new SListPure<PQLeafKey<edge, IndInfo *, bool> *>();
lkl->pushBack(ablk);
lkl->pushBack(aclk);
lkl->pushBack(adlk);
pqtree = new PQTree<edge, IndInfo *, bool>();
pqtree->Initialize(*lkl);
pqtree->writeGML("/home/LPT/graph_qtree_MOC_after_initialization.gml");
node e = G->newNode();
node f = G->newNode();
node g = G->newNode();
edge be = G->newEdge(b, e);
edge bf = G->newEdge(b, f);
edge bg = G->newEdge(b, g);
PQLeafKey<edge, IndInfo *, bool> *belk = new PQLeafKey<edge, IndInfo *, bool>(be);
PQLeafKey<edge, IndInfo *, bool> *bflk = new PQLeafKey<edge, IndInfo *, bool>(bf);
PQLeafKey<edge, IndInfo *, bool> *bglk = new PQLeafKey<edge, IndInfo *, bool>(bg);
SListPure<PQLeafKey<edge, IndInfo *, bool> *> *lkl4 = new SListPure<PQLeafKey<edge, IndInfo *, bool> *>();
lkl4->pushBack(belk);
lkl4->pushBack(bflk);
lkl4->pushBack(bglk);
PQInternalNode<edge, IndInfo *, bool> *father = (PQInternalNode<edge, IndInfo *, bool> *) (ablk->nodePointer());
father->type(PQNodeRoot::PNode);
bool r = pqtree->addNewLeavesToTree(father, *lkl4);
QString res = r ? "done." : "failed.";
std::cout << "Adding leaves to the tree for MOC has " << res.toStdString() << std::endl;
pqtree->writeGML("/home/LPT/graph_qtree_MOC_after_addition_be_bf_bg.gml");
Хорошо,
Я получил это и сделал, работает отлично. Извините за столь поздний ответ. Непосредственное добавление листьев к существующему листу не будет работать. Я использовал метод защищенных exchangeNodes (PQNode * oldNode, PQNode * newNode) в классе PQTree. Сначала я извлекаю ID листа, затем создаю новый PQInternalNode * newNode, который в свою очередь является EMPTY и P-Node с извлеченным ID. Извлечение и использование одного и того же идентификатора НЕ ДОЛЖНО, но выглядит таким образом более читабельным. Обмен узла листа на * newNode влияет на тип узла в листе и обманывает pqtree для обработки листа как p-узел, начинающийся после обмена, что, в свою очередь, позволяет мне добавлять новые листья в * newNode , который больше не является листом.
Других решений пока нет …