Я пытаюсь использовать 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
объект, чтобы я мог получить правильные метки для узлов в скопированном связанном подграфе?
Оказывается, это не так сложно, как я думал. Ключевой момент, которого мне не хватало, — это то, что GraphCopy::original
метод, чтобы получить узел с индексом из исходного графа, а затем использовать этот узел, чтобы получить метку.
// get the correct label for the first node of the GraphCopy object copy
attributes.label(copy.original(copy.firstNode()));
Других решений пока нет …