Как создать PropertyMap для графа повышения, используя listS в качестве контейнера вершин?

У меня есть график повышения, определенный как

typedef boost::adjacency_list<boost::setS, boost::listS,
        boost::undirectedS, CoordNode, CoordSegment> BGraph;
typedef boost::graph_traits<BGraph>::vertex_descriptor  VertexDesc;
BGraph _graph;

и я хочу знать связанные компоненты одного и того же графа с

 int num = boost::connected_components(_graph, propMap);

Я уже пытался создать требуемую карту свойств с возможностью записи (propMap) с помощью

typedef  std::map<VertexDesc, size_t> IndexMap;
IndexMap mapIndex;
boost::associative_property_map<IndexMap> propMap(mapIndex);
VertexIterator di, dj;
boost::tie(di, dj) = boost::vertices(_graph);
for(di; di != dj; ++di){
    boost::put(propMap, (*di), 0);
}

но это не работает; Я получаю ошибки компиляции.

Если бы контейнером вершин был vecS, было бы проще, потому что было бы достаточно простого массива или вектора. Но что я должен передать этой функции, если у меня есть listS в качестве контейнера вершин?

Как я могу создать необходимую карту свойств с возможностью записи? Может ли кто-нибудь привести мне пример?


person chaero    schedule 15.03.2013    source источник
comment
Ваши ошибки компиляции (которые вы всегда должны добавлять, если вы действительно хотите получить помощь) связаны с тем, что ваш граф не имеет карты индекса вершины (которая требуется картой цветов по умолчанию, используемой connected_components). Ваш propMap в порядке (хотя вам не нужно его инициализировать), вам просто нужно создать аналогичную индексную карту (эту нужно инициализировать) и передать ее алгоритму, используя именованные параметры. Вот пример.   -  person    schedule 15.03.2013
comment
@llonesmiz Спасибо! Теперь я, наконец, понял, что такое именованные параметры.   -  person chaero    schedule 15.03.2013


Ответы (1)


Работает!

typedef boost::adjacency_list
    <boost::setS, boost::listS,
        boost::undirectedS, 
        boost::no_property,
        boost::no_property> Graph;
    typedef boost::graph_traits<Graph>::vertex_iterator VertexIterator;
    typedef boost::graph_traits<Graph>::vertex_descriptor   VertexDesc;
    typedef std::map<VertexDesc, size_t> VertexDescMap; 

Graph graph;

...


VertexDescMap idxMap;
boost::associative_property_map<VertexDescMap> indexMap(idxMap);
VertexIterator di, dj;
boost::tie(di, dj) = boost::vertices(_graph);
for(int i = 0; di != dj; ++di,++i){
    boost::put(indexMap, (*di), i);
}


std::map<VertexDesc, size_t> compMap;
boost::associative_property_map<VertexDescMap> componentMap(compMap);            
boost::associative_property_map<VertexDescMap>& componentMap;

boost::connected_components(_graph, componentMap, boost::vertex_index_map(indexMap));   
person chaero    schedule 05.09.2013