adding custom vertices to a boost graph

后端 未结 2 1481
猫巷女王i
猫巷女王i 2020-12-02 16:16

If I have n elements defined with class CElement, how can one create vertices of those elements with boost graph - and connect them also? I\'ve seen boost graph bundled pro

相关标签:
2条回答
  • 2020-12-02 16:28

    I don't understand what you want to do exactly. Do you want to associate some data to vertices? Then use bundled properties.

    //Define a class that has the data you want to associate to every vertex and edge
    struct Vertex{ int foo;}
    struct Edge{std::string blah;}
    
    //Define the graph using those classes
    typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, Vertex, Edge > Graph;
    //Some typedefs for simplicity
    typedef boost::graph_traits<Graph>::vertex_descriptor vertex_t;
    typedef boost::graph_traits<Graph>::edge_descriptor edge_t;
    
    //Instanciate a graph
    Graph g;
    
    // Create two vertices in that graph
    vertex_t u = boost::add_vertex(g);
    vertex_t v = boost::add_vertex(g);
    
    // Create an edge conecting those two vertices
    edge_t e; bool b;
    boost::tie(e,b) = boost::add_edge(u,v,g);
    
    
    // Set the properties of a vertex and the edge
    g[u].foo = 42;
    g[e].blah = "Hello world";
    

    The are other ways to set the properties, but there you a have an example to bootstrap.

    I hope I didn't misunderstand the question.

    0 讨论(0)
  • 2020-12-02 16:36

    Note that Boost.Graph has overloads which allow to simplify Tristram's answer:

    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/graphviz.hpp>
    #include <iostream>
    
    int main()
    {
        struct Vertex { int foo; };
        struct Edge { std::string blah; };
    
        using namespace boost;
        using graph_t  = adjacency_list<listS, vecS, directedS, Vertex, Edge >;
        using vertex_t = graph_traits<graph_t>::vertex_descriptor;
        using edge_t   = graph_traits<graph_t>::edge_descriptor;
    
        //Instantiate a graph
        graph_t g;
    
        // Create two vertices in that graph
        vertex_t u = boost::add_vertex(Vertex{123}, g);
        vertex_t v = boost::add_vertex(Vertex{456}, g);
    
        // Create an edge conecting those two vertices
        boost::add_edge(u, v, Edge{"Hello"}, g);
    
        boost::write_graphviz(std::cout, g, [&] (auto& out, auto v) {
           out << "[label=\"" << g[v].foo << "\"]";
          },
          [&] (auto& out, auto e) {
           out << "[label=\"" << g[e].blah << "\"]";
        });
        std::cout << std::flush;
    }
    

    Output:

    digraph G {
    0[label="123"];
    1[label="456"];
    0->1 [label="Hello"];
    }
    
    0 讨论(0)
提交回复
热议问题