2016-06-09 15 views
0

Я пытаюсь использовать OGDF для выполнения некоторой обработки на графиках, загруженных из файлов GML. Эти графики имеют смысл только в том случае, если метки узлов поддерживаются. К сожалению, OGDF не упрощает сохранение атрибутов узлов, таких как метки, поскольку они поддерживаются в отдельной структуре данных, называемой GraphAttributes. Моя проблема заключается в том, что GraphAttributes связывает метки узлов с узлами индексы, которые не поддерживаются некоторыми преобразованиями графа, которые мне нужно использовать.Ведение GraphAttributes с помощью GraphCopy :: initByCC в OGDF

Одним из преобразований, которые мне нужно выполнить на графиках, является разделение каждого подключенного подграфа в файле GML. Загрузка графа и его узлы метки просто:

ogdf::Graph graph; 
ogdf::GraphAttributes attributes(graph, ogdf::GraphAttributes::nodeLabel); 
ogdf::GraphIO::readGML(attributes, graph, FILENAME); 

// this gives the correct label of the first node in the graph 
attributes.label(graph.firstNode()); 

Аналогичен, OG обеспечивают CCsInfo класс, чтобы найти связные подграфы графа. Поскольку я хочу работать с этими подграфами независимо, я использую метод GraphCopy::initByCC для создания отдельных экземпляров Graph.

ogdf::CCsInfo info(graph); 
ogdf::GraphCopy copy(graph); 
ogdf::EdgeArray<ogdf::edge> edgeArray(graph); 
// where i (int) is the number of the connected subgraph to copy 
copy.initByCC(info, i, edgeArray); 

// this now gives the wrong label for the first node in copy 
attributes.label(copy.firstNode()); 

Это работает, и copy содержит только узлы и ребра связного подграфа. Однако индексы узлов в копии отличаются от индексов узлов исходного графа. Это означает, что сопоставление меток с узлами в объекте attributes не применяется к узлам в copy.

Есть ли способ выполнить одно и то же преобразование объекта attributes, чтобы я мог получить правильные метки для узлов в скопированном подключенном подграфе?

+0

Тег [tag: gml] предназначен для языка Game Maker, а не для географического разметки. – PGmath

ответ

0

Получается, что это не так сложно, как я думал. Ключ, который мне не хватало, заключается в том, что вы можете использовать метод GraphCopy::original, чтобы получить узел с индексом из исходного графика, а затем использовать этот узел для получения метки.

// get the correct label for the first node of the GraphCopy object copy 
attributes.label(copy.original(copy.firstNode()));