Boost Graph Library: связанные свойства и итерации по краям - PullRequest
4 голосов
/ 14 октября 2011

Просто пытаюсь разобраться с библиотекой графов ускорения, и у меня есть несколько вопросов. Я пишу некоторый код, который является классом-оболочкой для графа BGL. Идея состоит в том, что я могу манипулировать графиком так, как хочу, а затем вызвать метод-обертку для вывода графика в формате GEXF (XML).

Мой код выглядит примерно так:

struct Vertex {
   std::string label;
   ...
};

struct Edge {
   std::string label;
   double weight;
   ...
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex, Edge> GraphType;

template <typename Graph>
class GEXF
{
   private:
      Graph graph;
   ...
};

template <typename Graph>
void GEXF<Graph>::buildXML()
{
   ...

   // output the edges
   property_map<adjacency_list<>, edge_index_t>::type edge_id = get(edge_index, graph);
   GraphType::edge_iterator e, e_end;
   for(tie(e, e_end) = edges(graph); e != e_end; ++e)
   {
      xmlpp::Element *edge = ePtr->add_child("edge");

      // next line gives an error, property not found
      edge->set_attribute("id", tostring<size_t>(get(edge_id, *e)));
      edge->set_attribute("source", tostring<size_t>(source(*e, graph)));
      edge->set_attribute("target", tostring<size_t>(target(*e, graph)));
   }
}

...
// instantiate in main():
GEXF<GraphType> gexf;

Вот мои вопросы:

  1. Когда я использую связанные свойства, я могу получить доступ к vertex_index, но не могу получить доступ к edge_index. Как получить доступ к краевым индексам?

  2. В приведенном выше коде я хотел сохранить универсальный класс GEXF, но столкнулся с проблемой при попытке объявить Graph::edge_iterator e, e_end; Приведенный выше код работает, но он использует конкретный тип. Как я должен объявлять edge_iterator вообще?

1 Ответ

2 голосов
/ 21 октября 2011

В объекте boost::adjacency_list<...> по умолчанию отсутствует edge_index, поскольку его поддержка влияет на сложность. Вы должны создать его самостоятельно, но вы должны позаботиться о том, чтобы он обеспечивал желаемую функциональность.

Ранее:

Свойства Boost Subgraph и Bundled

edge_index ноль для всех ребер?

Повысить ребра графа с помощью индексов

...