首页 文章

增强图:如何在不复制属性的情况下复制图形的节点和边缘?

提问于
浏览
6

我正在使用带有捆绑属性的boost图 . 在我构建第一个参考树之后 . 我想有几个其他树具有相同的结构和层次结构,但具有不同的顶点和边缘属性 . 我发现有一个copy_graph方法,但不知道如何使用它实现我的目的 . 例如,我首先创建一个引用树, VertexProperty1EdgeProperty1 是捆绑属性

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

经过一些处理后,g1包含一些顶点和边 . 然后我想要一个具有不同捆绑属性的复制树 .

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

在此先感谢任何帮助 . 示例代码将是首选 .

1 回答

  • 6

    如果查看documentation,您可以看到参数 vertex_copyedge_copy 是实际复制属性的参数 . 这些参数的默认值复制每个顶点/边的所有属性,你需要"does nothing"代替:

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

    然后像这样调用 copy_graph

    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);
    
    }
    

相关问题