2016-01-26 20 views
6

Korzystam z wykresu zwiększenia z dołączonymi właściwościami. Po zbudowaniu pierwszego drzewa referencyjnego. Chciałbym mieć kilka innych drzew o tej samej strukturze i hierarchii, ale z inną właściwością wierzchołków i krawędzi. Uważam, że istnieje metoda copy_graph, ale nie wiem, jak osiągnąć mój cel za pomocą tego. Na przykład, najpierw tworzenia drzewa odniesienia VertexProperty1 i EdgeProperty1 są dołączone właściwościWykres wzmocnienia: jak skopiować węzły i krawędzie wykresu bez właściwości kopiowania?

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

Po pewnym przetwarzania G1 zawiera kilka wierzchołków i krawędzie. Następnie chciałbym mieć skopiowane drzewo z różnymi pakietami właściwości.

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

Z góry dziękuję za wszelką pomoc. Przykładowy kod byłby preferowany.

Odpowiedz

6

Jeśli spojrzeć na documentation widać, że parametry vertex_copy i edge_copy są tymi, które faktycznie kopiują właściwości. Domyślna wartość dla tych parametrów skopiować wszystkie właściwości w każdym vertex/EDGE, trzeba coś, że „nic nie robi”, zamiast:

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

A potem powołać copy_graph tak:

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

Niezła, pokonałaś mnie. I jest znacznie lepiej :) – sehe

+0

To doskonale rozwiązuje mój problem. Bardzo dziękuję! – youround