В контексте BGL мне нужно итерации in_edges
и out_edges
, но я хочу исключить те, которые являются частью обратных ребер, то есть исключают те, которые являются частью обратных краев property_map
. В приведенном ниже коде показано, что я хотел бы сделать, но, конечно, property_map
не имеет find
и end
методов.Свойство Boost property_map проверяет, существует ли ключ?
UPDATE: Возможное решение состоит в том, чтобы поддерживать отдельную структуру, такую как карта, содержащая обратные ребра при построении графика. Это будет работать, если у меня будет контроль над построением графика, но я не потому, что я использую функцию read_dimacs_max_flow
для чтения графического файла в формате DIMACS. Поэтому я могу полагаться только на методы доступности BGL, чтобы выяснить, что это такое.
определение Graph:
typedef adjacency_list_traits<vecS, vecS, bidirectionalS> ttraits;
typedef adjacency_list<vecS, vecS, bidirectionalS,
// vertex properties
property<vertex_index_t, int,
property<vertex_color_t, default_color_type> >,
// edge properties
property<edge_capacity_t, int,
property<edge_residual_capacity_t, int,
property<edge_reverse_t, ttraits::edge_descriptor> > >, no_property, vecS> tbgl_adjlist_bidir;
typedef graph_traits<tbgl_adjlist_bidir>::vertex_descriptor tvertex;
typedef graph_traits<tbgl_adjlist_bidir>::edge_descriptor tedge;
typedef property_map<tbgl_adjlist_bidir, edge_capacity_t>::type tedge_capacity_map;
typedef property_map<tbgl_adjlist_bidir, edge_reverse_t>::type treverse_edge_map;
typedef property_map<tbgl_adjlist_bidir, vertex_color_t>::type tvertex_color_map;
typedef property_map<tbgl_adjlist_bidir, vertex_index_t>::type tvertex_index_map;
typedef graph_traits<tbgl_adjlist_bidir>::vertex_iterator tvertex_iterator;
typedef graph_traits<tbgl_adjlist_bidir>::edge_iterator tedge_iterator;
typedef graph_traits<tbgl_adjlist_bidir>::out_edge_iterator tout_edge_iterator;
typedef graph_traits<tbgl_adjlist_bidir>::in_edge_iterator tin_edge_iterator;
и пример фрагмент того, что я хотел бы сделать (но не компилирует с ошибкой ниже):
tvertex_index_map indices = get(vertex_index, bgl_adjlist_bidir);
tedge_capacity_map capacities = get(edge_capacity, bgl_adjlist_bidir);
treverse_edge_map rev_edges = get(edge_reverse, bgl_adjlist_bidir);
// iterate all vertices in the right order
for (int current = 0; current < m_num_vertices; ++current) {
printf("processing vertex=%d\n", current);
tin_edge_iterator ei1, ei1_end;
for (tie(ei1, ei1_end) = in_edges(tvertex(current), bgl_adjlist_bidir); ei1 != ei1_end; ++ei1) {
// exclude reverse edges <<<<<<<======= HOW DO I DO THIS??
if (rev_edges.find(*ei1) != rev_edges.end()) {
continue;
}
int in = indices[boost::source(*ei1, bgl_adjlist_bidir)];
printf("in edge: %d <- %d \n", current, in);
}
}
и ошибки компилятора:
/Users/bravegag/code/fastcode_project/build_debug$ make 2> out ; grep -i "error" ./out
[ 2%] Building CXX object CMakeFiles/submodularity.dir/src/graph/hp_adjlist_bidir.cc.o
/Users/bravegag/code/fastcode_project/code/src/api/hp_adjlist_bidir.h:146:18: error: 'treverse_edge_map' has no member named 'find'
/Users/bravegag/code/fastcode_project/code/src/api/hp_adjlist_bidir.h:146:42: error: 'treverse_edge_map' has no member named 'end'
make[2]: *** [CMakeFiles/submodularity.dir/src/graph/hp_adjlist_bidir.cc.o] Error 1
make[1]: *** [CMakeFiles/submodularity.dir/all] Error 2
make: *** [all] Error 2
спасибо за такой подробный и информативный ответ, много приятной информации :) Тем не менее, я не могу напрямую контролировать построение графика, иначе я бы решил его просто, как вы предлагаете использовать мою собственную карту. Вместо этого я использую функцию BGL 'read_dimacs_max_flow' для чтения графического файла в формате DIMACS, и поэтому я могу полагаться только на функции BGL, чтобы узнать, что это такое, другими словами, королевская боль в попке :( –
Спасибо за этот пост. Это очень вдохновило меня. Я страдаю от плохой документации по библиотеке ускорителей и должен искать в целом Google, чтобы найти работоспособный способ добавления правильных аргументов для запуска алгоритма с максимальным потоком. Теперь я собираюсь попробовать собственный std :: map type reverse map и надеюсь, что он сработает. –