BGL — использование алгоритмов потока со связанными свойствами

Я не могу понять, как заставить алгоритм максимального потока BGL работать со связанными свойствами.

Настройте график следующим образом:

struct VertexProperties{

};

struct EdgeProperties{
int id;
int capacity;
int residual_capacity;
};

typedef boost::adjacency_list<vecS,vecS,directedS,VertexProperties,EdgeProperties> Graph;
typedef boost::graph_traits<Graph> Traits;
typedef Traits::vertex_descriptor Vertex;
typedef Traits::edge_descriptor Edge;

Я создаю

Graph g(nofNodes); // nofNodes > 2

и выбрать

Vertex s = vertex(nofNodes-2,g); //source
Vertex t = vertex(nofNodes-1,g); //sink

Затем я продолжаю добавлять ребра на график и добавлять обратные ребра емкостью 0 для каждого вставленного ребра.

Использование карты

std::map<Edge,Edge> reverse_edge_of;

а также

void do_add_edge(int& next_id, const Vertex& a, const Vertex& b, const int c, Graph& g,std::map<Edge,Edge>& reverse_edge_of){
Edge e,re; bool success;

std::tie(e,success) = add_edge(a,b,g);
g[e].id = next_id;
g[e].capacity = c;
g[e].residual_capacity = c;

//reverse edge
std::tie(re,success) = add_edge(b,a,g);
g[re].id = next_id + 1;
g[re].capacity = 0;
g[re].residual_capacity = 0;

reverse_edge_of[e] = re;
reverse_edge_of[re] = e;

next_id += 2;
}

После того, как это сделано, я пытаюсь вызвать функцию библиотеки push_relabel_max_flow как это:

push_relabel_max_flow(
g,
s,
t,
capacity_map(get(&EdgeProperties::capacity,g))
.residual_capacity_map(get(&EdgeProperties::residual_capacity,g))
.reverse_edge_map(make_assoc_property_map(reverse_edge_of))
.vertex_index_map(get(vertex_index,g))
);

Это не скомпилируется (с очень нечитаемым сообщением об ошибке).

К сожалению, в примере, представленном в документации, все еще используются внутренние свойства, которые он пометил как устаревшие, поэтому я пытаюсь найти ошибку в моем подходе. Кто-нибудь случайно это видел?

И в то время как мы находимся на этом (и поскольку это вполне возможно связано), могу ли я как-то сделать обратное ребро ребра (частью связанного!) Свойства ребра? Если так, то как?

ОБНОВИТЬ

Понятия не имею, что здесь происходит, но получается

        int maxflow = push_relabel_max_flow(
g,
s,
t,
capacity_map(get(&EdgeProperties::capacity,g))
.residual_capacity_map(get(&EdgeProperties::residual_capacity,g))
.reverse_edge_map(make_assoc_property_map(reverse_edge_of))
.vertex_index_map(get(vertex_index,g))
);

выдаст ошибку, тогда как

        int maxflow = push_relabel_max_flow(
g,
s,
t,
get(&EdgeProperties::capacity,g),
get(&EdgeProperties::residual_capacity,g),
make_assoc_property_map(reverse_edge_of),
get(vertex_index,g)
);

не.

(например.

работает как задумано: http://ideone.com/U3O0p8

ошибка компилятора: http://ideone.com/uUuiKc

)

1

Решение

По крайней мере, вы должны передать в карту свойств, где ожидается:

.reverse_edge_map(make_assoc_property_map(reverse_edge_of))
1

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

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