2012-07-26 10 views
5

chcę użyć zwiększa breadth_first_visit metody i chciałbym przekazać jej własnym „zewnętrznej” kolorów mapy. I określonych wykres następującomapa kolorów na wykresie doładowania breadth_first_visit

typedef boost::adjacency_list<boost::setS, boost::listS, boost::undirectedS, 
    boost::property<boost::vertex_index_t, int, 
    boost::property<boost::vertex_color_t, boost::default_color_type, 
    Node_t>>> GraphType; 

gdzie Node_t jest struktura, określające właściwości wierzchołków. Jednak nie mogę się dowiedzieć, w jaki sposób mogę dostarczyć BFS z moją własną mapą kolorów. Chciałbym zapisać kolorów wierzchołków w wektorze, więc moja definicja wygląda

std::vector<boost::default_color_type> colors; 

ale nie mogę zrozumieć to, jak wykorzystać to dla BFS.

Ani

boost::breadth_first_search(g, *boost::vertices(g).first, 
    boost::color_map(colors)); 

ani

boost::breadth_first_search(g, *boost::vertices(g).first, 
    boost::color_map(&colors[0])); 

działa. O ile pierwszy daje mi kilka różnych błędów kompilatora (np default-int nie jest obsługiwany „boost :: color_traits” Użycie typu klasy wymaga listę argumentów typu) drugi kompilacji przerywa tylko C2664: „boost :: umieścić” nie może przekonwertuj parametr 2 z "void *" na "ptrdiff_t".

Więc pytanie brzmi: Jak mogę użyć własnego Color-mapping-strukturę. Dodatkowe pytanie brzmi: Jak mogę uzyskać wartość koloru dla określonego vertex_descriptor?

Odpowiedz

4

Ok, użyłem innego podejścia, ale rozwiązać mój problem. Dla tych, którzy są tak zdezorientowany jak ja o mapy kolorów w podbicia lub tych, którzy są zainteresowani:

rodzaju mapy kolorów, jak BFS używa go jest:

typedef boost::property_map<GraphType, boost::vertex_color_t>::type color_map_t; 
color_map_t colorMap; //Create a color map 

ten odwzorowuje vertex_descriptor do (w mój przypadek) default_color_type. Odpowiednie połączenie do doładowania za BFS byłoby

boost::breadth_first_visit(g, *boost::vertices(g).first, boost::color_map(colorMap)); 

Biorąc pod uwagę strukturę color_names który mapuje liczbę kolorów jak

const char* color_names[] = {"white", "gray", "green", "red", "black"}; 

jeden mógłby iterację kolorów przez Iterowanie nad wszystkie wierzchołki w grafie i używając vertex_descriptor bieżącego wierzchołka jako argument za [] -operator na mapie kolor:

GraphType::vertex_iterator it, itEnd; 
for (boost::tie(it, itEnd) = boost::vertices(g); it != itEnd; it++) 
{ 
    std::cout << "Color of node " << *it << " is " << color_names[colorMap[*it]] << std::endl; 
} 
+0

w 'boost :: breadth_first_visit (g * boost :: wierzchołków (g) .first, boost :: color_map (colormap)); 'ty ' nie przekazujesz odwiedzającego - jaki jest podpis, aby przekazać odwiedzającego i mapę kolorów? –

+0

uff, to jest to dość długi czas temu;) I nie próbujcie tego na zewnątrz, ale [tutaj] (http://www.boost.org/doc/libs/1_62_0/libs/graph/doc/breadth_first_visit.html), które znajdź drugą sygnaturę z argumentem 'BFSVisitor' jako argumentem. – AquilaRapax

+0

Myślę, że naprawdę to wymyśliłem - używa podpisu "nazwanego argumentu". Nie wiem, jak powinieneś wiedzieć, które nazwy są poprawnymi argumentami, ale dla 'szerokość_pierwszego_wyszukiwania 'wygląda na to, że' odwiedzający' to jeden, a 'color_map' to inny. –