2016-11-22 2 views
0

Используя OGDF, я создал и инициализировал PQTree. Инициализация была выполнена с тремя ребрами, где узел a является корнем, b, c и d являются Листами a. Теперь, после вычисления, мне нужно добавить листья e, d и f в b как листья. Но проблема в том, что b - лист, поэтому не принимает ни детей, ни листьев. Код здесь. Как и std :: cout, я добавил, что они были добавлены, но если я напишу его в файл GML с помощью writeGML, нет никакой разницы между до и после добавления узлов, они не находятся в дереве. Я думаю, это из-за PQLeafKey, где для не-листовых ребер/узлов он должен быть PQNodeKey. Согласно документации, ablk-> nodePointer() должен возвращать PQLeaf, который получен из PQNode и не «совместим» с PQInternelNode, который также выводил PQNode. Но я не знаю, как добавить по-другому. Код:OGDF PQTree: Как добавить листья?

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"); 

ответ

0

ока, доки,

Я получил это и делал, работает отлично. Извините за столь поздний ответ. Непосредственное добавление листьев к существующему листу не будет работать. Метод, который я использовал, - это protected exchangeNodes (PQNode * oldNode, PQNode * newNode) в классе PQTree. Сначала я извлекаю идентификатор листа, а затем создаю новый PQInternalNode * newNode, который, в свою очередь, является EMPTY и P-Node с извлеченным идентификатором. Извлечение и использование одного и того же ID не является ДОЛЖНЫ, но он выглядит таким образом более читаемым. Обмен узлом листа с * newNode влияет на тип узла в листе и обманывает pqtree для обработки листа, как p-узел, начинающийся после обмена, что, в свою очередь, позволяет мне добавлять новые листья в * newNode , который больше не является листом.

Смежные вопросы