Повысьте подграф и связанные свойства

Я использую связанные свойства и adjacency_list и хотел бы использовать класс подграфа.

struct Vertex
{
   int index;
   int seed;
}; 

struct Edge
{
 bool visted;
 double weight;
};

typedef adjacency_list<listS, listS, undirectedS, Vertex, property<edge_index_t,int,Edge> > Graph;
typedef subgraph<Graph> testSubgraph;

property<edge_index_t,int,Edge> часть нужна, так как нужен подграф edge_index_t сравнить два ребра.

Теперь мой вопрос: как мне добавить Edge, используя связанные свойства в подграфе? В нормальном графе без property<edge_index_t,int,Edge> Я добавляю ребро следующим образом:

Edge e;
vertex_descriptor u,v; 
// fill in u and v;
e.weight = 1.0;
e.visted=false;
add_edge(u,v,e,graph);

Но это не работает для Subgraph.

Надеюсь, кто-то знает решение для этого.

Спасибо

Бен

3 ответа

Я просто столкнулся с подобной проблемой при попытке добавить вершину с add_vertex() и обнаружил, что есть (очень старая) нерешенная проблема на багтрекере буста:

Билет № 380: Поддержка связанных свойств в графических адаптерах:

Графические адаптеры (такие как подграф) не поддерживают связанные свойства, но они должны.


Дальнейший поиск привел к появлению следующих 2 патчей, которые еще не объединены, но, по-видимому, наконец принесли поддержку связанных свойств в подграфах:

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

Список смежности не имеет edge_index:es. Вы должны назначить индекс самостоятельно, но это так же просто, как добавить size_t index к Edgeи назначение индекса при создании ребер.

Вероятно, вам не нужно создавать ребра для подграфа, так как подграфы повышения являются индуцированными подграфами. Следовательно, все ребра графа, обе конечные точки которого находятся в подграфе, будут включены в ваши подграфы.

Я также только изучаю BGL, и следующий код работает для добавления свойства связанного края в вызове.

      boost::add_edge(vd1, vd2, testSubgraph::edge_property_type{0, Edge{/* ... */}}, graph);

0является фиктивным индексом ребра, и, согласно моему опыту, BGL заменяет его правильным индексом ребра. Я не знаю, всегда ли это так (приветствуются любые комментарии).

Вы также можете просто добавить ребро в подграф, не используя пакет, и использовать дескриптор ребра, возвращаемый функцией add_edgeчтобы добавить свойства позже.

      auto pair = boost::add_edge(vd1, vd2, graph);
boost::put(boost::get(&Edge::member_name1, graph), pair.first, member_value1);
/* ... */

Не знаю, можно ли putполный пакет свойств с использованием второго метода.

Другие вопросы по тегам