boost/graph поиск несвязаных между собой наборов вершин
От: Helgiii  
Дата: 06.11.07 12:18
Оценка:
Народ если кто пользовался подскажите плиз...
сам граф работает, но еще не до конца разобрался с пропертисами вершин и ребер... которые используются в алгоритмах..
мой граф выглядит так..
typedef adjacency_list<listS,listS,undirectedS,VERTEX,EDGE> GraphType;
для него сделан класс оболочка...и в нем описаны структуры VERTEX,EDGE... но это не суть

вопрос..
как найти "острова" в этом графе или вообще в графе у которого есть пользовательские свойства для вершин и ребер
нужно использовать static connected components или incremented conneceted components... согласно докам
как? в примерах все графы без переданных в шаблоне типов структур со свойствами для ребер и вершин, то есть
typedef adjacency_list<vecS,vecS,undirectedS>

из примера кусок кода беру — компилится.., подставляю вместо vecS listS, задаю свойства вершин и ребер параметром шаблона и не компилится..

я понял что нужно сделать property_map .. ладно дальше объяснять бесполезно, если делали, то знаете.. если нет то не поможете

ХЕЛП!!!!
Re: boost/graph поиск несвязаных между собой наборов вершин
От: Helgiii  
Дата: 06.11.07 12:27
Оценка:
или как сделать property_map... чтобы передать его параметром в алгоритм..
кхм... мда.. буст навороченная штука
Re: boost/graph поиск несвязаных между собой наборов вершин
От: Аноним  
Дата: 07.11.07 11:40
Оценка:
По всей видимости Вам необходимо использовать associative_property_map, он описан <boost\property_map.hpp>. Там есть вспомогательная функция make_assoc_property_map. Этот класс/функция используется для фтыкания ассоциативных контейнеров типа std::map в алгоритмы BGL в виде отображений свойств. Для определения "островов", то есть компонент связности, в Вашем случае неориентированного графа лучше использовать connected_components. Во всяком случае у меня получилось, правда для хранения вершин я использовал vecS. В вашем случае надо примерно так:

typedef graph_traits<GraphType>::vertex_descriptor vertex_desc;
typedef graph_traits<GraphType>::vertices_size_type vertices_size_type;
typedef std::map<vertex_desc, vertices_size_type> ComponentMap;
typedef std::map<vertex_desc, vertices_size_type> ComponentMap;
ComponentMap comp_map;
associative_property_map<ComponentMap> ass_map=make_assoc_property_map(comp_map);

//потом где-то в вызове connected_components передать ass_map, примерно так
//int com_count=connected_components(graph, ass_map);
//или
//int com_count=connected_components(graph, make_assoc_property_map(comp_map));

потом уже из comp_map извлекать номер компоненты дял каждого дескриптора вершины.

Я так в принципе не делал, но думаю будет работать. А ввобще есть хорошая книжка на русском по Boost Graph Library, на Books.ru купил, не нарадуюсь
Re[2]: boost/graph поиск несвязаных между собой наборов вер
От: Helgiii  
Дата: 07.11.07 11:47
Оценка:
Здравствуйте, Аноним

книжка уже в пути (скоро доставят), давно собирался купить ее но не особо нужна была, а тут
по работе приперло и наконец то с радостью заказал в изд.Питер..
обязательно попробую ваш метод, что получилось отпишу
thanx
Re[2]: boost/graph поиск несвязаных между собой наборов вер
От: Helgiii  
Дата: 07.11.07 13:32
Оценка:
Здравствуйте, Аноним

так компилится

typedef adjacency_list < listS, vecS, undirectedS, BallsGraph::VERTEX, BallsGraph::EDGE > GraphType;
typedef graph_traits< GraphType >::vertex_descriptor vertex_desc;
typedef graph_traits< GraphType >::vertices_size_type vertices_size_type;
typedef std::map<vertex_desc, vertices_size_type> ComponentMap;

GraphType G(6);
ComponentMap comp_map;
std::vector<int> component(num_vertices(G));

associative_property_map<ComponentMap> ass_map = make_assoc_property_map(comp_map);
int com_count = connected_components(G, ass_map);


а если заменить первую строку на
typedef adjacency_list < listS, listS, undirectedS, BallsGraph::VERTEX, BallsGraph::EDGE > GraphType;
то есть вторым параметром поставить listS

ошибка

error C2679: binary '+' : no operator found which takes a right-hand operand of type 'const boost::detail::error_property_not_found' (or there is no acceptable conversion)


ключевой момент видимо error_property_not_found
Re: boost/graph поиск несвязаных между собой наборов вершин
От: Аноним  
Дата: 08.11.07 06:21
Оценка:
Вот такой код у меня в VC 6.0 компилитца. Не знаю как насчет работы. Тут, видимо, дело в color_map, если тип дескриптора вершины не целый, то надо фтыкать соответствующее отображение для раскраски вершин. Там по молчку вектор размером в число вершин, а для listS это не подходит.

typedef adjacency_list<listS, listS, undirectedS> BGLComponentGraph;
typedef graph_traits<BGLComponentGraph>::vertex_descriptor vertex_desc;
typedef graph_traits<BGLComponentGraph>::vertices_size_type vertices_size_type;
typedef std::map<vertex_desc, int> ComponentMap;
typedef std::map<vertex_desc, default_color_type> ColorMap;
ComponentMap comp_map;
ColorMap col_map;
BGLComponentGraph t_graph;
int com_count=connected_components(t_graph,
make_assoc_property_map(comp_map),
color_map(make_assoc_property_map(col_map)));

Кстати пример для strong_components у меня не компилица, компилер вылетает, типа INTERNAL COMPILER ERROR, по ходу MSVC6 староват.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.