Ведение GraphAttributes с GraphCopy :: initByCC в OGDF

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

Одно из преобразований, которое мне нужно выполнить на графиках, — разделить каждый связанный подграф в файле 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());

Аналогичным образом, OGDF обеспечивают 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

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]