2012-07-26 6 views
5

Ich möchte Boosts breadth_first_visit Methode verwenden und ich möchte es mit meiner eigenen "externen" Farbkarte zur Verfügung stellen. I definiert sind, wie das DiagrammFarbkarte in Boost-Grafik breath_first_visit

folgt
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; 

wo Node_t ein struct ist, um die Eigenschaften für die Ecken. Allerdings kann ich nicht herausfinden, wie ich das BFS mit meiner eigenen Farbkarte versorgen kann. Ich mag die Vertexfarben in einem Vektor speichern, so dass meine Definition sieht aus wie

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

, aber ich kann es nicht herausgefunden, wie dies für die bfs zu verwenden.

Weder

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

noch

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

arbeitet. Während der erste gibt mir eine Reihe von verschiedenen Compiler-Fehler (zB default-int wird nicht unterstützt, "boost :: color_traits" Verwendung der Klassenart erfordert Typ Argumentliste) der zweite Kompilierung bricht nur mit C2664 ab: 'boost :: put' kann nicht Konvertiere Parameter 2 von 'void *' in 'ptrdiff_t'.

Die Frage ist also: Wie kann ich meine eigene Farbmapping-Struktur verwenden? Eine zusätzliche Frage wäre: Wie kann ich den Farbwert für einen bestimmten Vertex_descriptor bekommen?

Antwort

4

Ok, ich habe einen anderen Ansatz verwendet, aber mein Problem gelöst. Für diejenigen, die so verwirrt sind, wie ich über Farbkarten in boost oder denen, die daran interessiert sind:

Die Art der Farbkarte, wie bfs es verwendet wird:

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

Diese Karten vertex_descriptor zu (in mein Fall) default_color_type. Die entsprechende Forderung des steigern bfs wäre

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

eine color_names Struktur gegeben, die die Farbzahl abbildet wie

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

man durch die Farben, die durch Iteration über alle Knoten in dem Graphen und mit Hilfe der vertex_descriptor laufen könnte des aktuellen Vertex als Argument für die [] -Operator in der Farbkarte:

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

in 'boost :: breadth_first_visit (g, * boost :: Eckpunkten (g) .First boost :: color_map (ColorMap)) "du" Übergeben eines Besuchers nicht - Was ist die Unterschrift, um einen Besucher und eine Farbkarte zu übergeben? –

+0

Puh, das ist schon ziemlich lange her;) Ich habe das nicht ausprobiert, aber [hier] (http://www.boost.org/doc/libs/1_62_0/libs/graph/doc/breath_first_visit.html) Sie finde die zweite Signatur mit einer 'BFSVisitor'-Klasse als Argument. – AquilaRapax

+0

Ich denke, ich habe es tatsächlich herausgefunden - es verwendet die "benannte Argument" -Signatur. Ich weiß nicht, wie Sie wissen sollen, welche Namen gültige Argumente sind, aber für 'breath_first_search' scheint es, dass' visitor' eins ist und 'color_map' ein anderes ist. –

Verwandte Themen