2016-01-26 11 views
6

Sto utilizzando il grafico di incremento con proprietà raggruppate. Dopo aver costruito il primo albero di riferimento. Mi piacerebbe avere molti altri alberi con la stessa struttura e la stessa gerarchia ma con diverse proprietà di vertici e bordi. Trovo che ci sia un metodo copy_graph ma non so come raggiungere il mio scopo usando questo. Ad esempio, ho creare un albero di riferimento, e VertexProperty1EdgeProperty1 sono proprietàGrafico boost: come copiare i nodi e i bordi di un grafico senza copiare le proprietà?

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperty1, EdgeProperty1> Graph; 
Graph g1; 

Dopo alcuni trattamenti bundle, g1 contiene alcuni vertici e spigoli. Quindi vorrei avere un albero copiato con diverse proprietà raggruppate.

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperty2, EdgeProperty2> Graph2; 
copy_graph(g1, g2, ???); 

Grazie in anticipo per qualsiasi tipo di aiuto. Il codice di esempio sarebbe preferito.

risposta

6

Se si guarda il numero documentation, è possibile vedere che i parametri vertex_copy e edge_copy sono quelli che effettivamente copiano le proprietà. Il valore predefinito per i parametri copiare tutte le proprietà in ogni vertice/bordo, avete bisogno di qualcosa che "non fa nulla" invece:

struct do_nothing 
{ 
    template <typename VertexOrEdge1, typename VertexOrEdge2> 
    void operator()(const VertexOrEdge1& , VertexOrEdge2&) const 
    { 
    } 
}; 

E quindi richiamare copy_graph come questo:

copy_graph(g1,g2,boost::vertex_copy(do_nothing()).edge_copy(do_nothing())); 

Running on Coliru

#include <iostream> 
#include <string> 

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/copy.hpp> 
#include <boost/graph/graph_utility.hpp> 

struct VertexProp1 
{ 
    int color; 
}; 

struct VertexProp2 
{ 
    std::string name; 
}; 

struct EdgeProp1 
{ 
    double weight; 
}; 

struct EdgeProp2 
{ 
    std::string name; 
}; 

typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::bidirectionalS,VertexProp1,EdgeProp1> Graph1; 
typedef boost::graph_traits<Graph1>::vertex_descriptor VertexDesc; 

typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::bidirectionalS,VertexProp2,EdgeProp2> Graph2; 

struct do_nothing 
{ 
    template <typename VertexOrEdge1, typename VertexOrEdge2> 
    void operator()(const VertexOrEdge1& , VertexOrEdge2&) const 
    { 
    } 
}; 

void build_graph(Graph1& g) 
{ 
    VertexDesc v0=add_vertex(VertexProp1{1},g); 
    VertexDesc v1=add_vertex(VertexProp1{2},g); 
    VertexDesc v2=add_vertex(VertexProp1{3},g); 
    add_edge(v0,v1,EdgeProp1{1.0},g); 
    add_edge(v1,v2,EdgeProp1{2.0},g); 
    add_edge(v2,v0,EdgeProp1{3.0},g); 

} 


int main() 
{ 
    Graph1 g1; 
    build_graph(g1); 

    std::cout << "Graph1" << std::endl; 
    print_graph(g1); 

    Graph2 g2; 

    copy_graph(g1,g2,boost::vertex_copy(do_nothing()).edge_copy(do_nothing())); 

    std::cout << "Graph2" << std::endl; 
    print_graph(g2); 

} 
+0

Bello, mi hai battuto al punch. Ed è molto meglio :) – sehe

+0

Questo risolve perfettamente il mio problema. Grazie mille! – youround

Problemi correlati