2012-07-26 12 views
5

Quiero usar el método de aumentos breadth_first_visit y me gustaría proporcionarlo con mi propio mapa de colores "externo". he definido el gráfico de la siguienteMapa de colores en el gráfico de boost 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; 

donde Node_t es una estructura, la definición de las propiedades de los vértices. Sin embargo, no puedo averiguar cómo puedo proporcionar el BFS con mi propio mapa de colores. Me gustaría para almacenar los colores de los vértices en un vector, por lo que mi definición parece

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

pero no puedo entenderlo, cómo utilizar esto para las BFS.

Ni

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

ni

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

está trabajando. Mientras que el primero me da un montón de errores de compilación diferentes (por ejemplo, no se admite el valor predeterminado-int, el uso del tipo de clase requiere lista de argumentos del tipo "boost :: color_traits") la segunda compilación aborta solo con C2664: 'boost :: put' no puede convierte el parámetro 2 de 'void *' a 'ptrdiff_t'.

Entonces la pregunta es: ¿Cómo puedo usar mi propia estructura de mapeo de color? Una pregunta adicional sería: ¿Cómo puedo obtener el valor de color para un vertex_descriptor específico?

Respuesta

4

Bien, utilicé otro enfoque pero resolví mi problema. Para aquellos que están tan confundidos como yo estaba a punto mapas de colores en impulso o aquellos que están interesados:

el tipo de mapa de color, como BFS utiliza es:

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

Esto mapea vertex_descriptor a (en mi caso) default_color_type. La llamada adecuada para impulsar de BFS serían

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

cuenten con una estructura color_names que se asigna el número del color como

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

uno podría iterar a través de los colores por iteración sobre todos los vértices en el gráfico y el uso de la vertex_descriptor del vértice actual como un argumento para el [] -operator en el mapa de color:

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

en 'impulso :: breadth_first_visit (g, * boost :: vértices (g) .First, impulso :: color_map (mapa de colores)); "tú" no está pasando a un visitante: ¿cuál es la firma para pasar a un visitante y un mapa de color? –

+0

phew, eso es hace mucho tiempo;) no probé esto, pero [aquí] (http://www.boost.org/doc/libs/1_62_0/libs/graph/doc/breadth_first_visit.html) usted encuentre la segunda firma con una clase 'BFSVisitor' como argumento. – AquilaRapax

+0

Creo que lo descubrí realmente: está usando la firma del "argumento nombrado". No sé cómo se supone que debes saber qué nombres son válidos, pero para 'breadth_first_search' parece que' visitor' es uno y 'color_map' es otro. –

Cuestiones relacionadas