Повысьте подграф и связанные свойства
Я использую связанные свойства и 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 патчей, которые еще не объединены, но, по-видимому, наконец принесли поддержку связанных свойств в подграфах:
- Билет № 10708: поддержка свойств в методе add_vertex() для подграфа
- Билет № 10709: поддержка графов в подграфе
Поэтому я предполагаю, что ответ таков: пока не используйте связанные свойства. Но в будущем проблема должна исчезнуть.
Список смежности не имеет 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
полный пакет свойств с использованием второго метода.