Boost logo

Boost Users :

From: Douglas Gregor (doug.gregor_at_[hidden])
Date: 2007-03-22 09:55:16


On Wed, 2007-03-21 at 19:15 -0400, Naomi Fox wrote:
> So I define my graph class with bundled properties as so:
>
> struct MyV {
> int numStars;
> };
>
> struct MyE {
> int numStars;
> };
>
> typedef adjacency_list<setS, setS, bidirectionalS, MyV, MyE> MyGraph;
>
> Then in my main function, I make a MyGraph object and put in vertices
> and edges, and assign property values. That works fine.
[snip]
> Then I perform dfs on my graph
>
> depth_first_search(g, visitor(star_vis));

The problem in this case isn't the bundled properties, it's that
depth_first_search needs either a color map or an index map, neither of
which is available to it. I really wish we could make those error
messages make some sense, though :(

So, there are a couple of fixes. The goal is to associate each vertex
with an index, which is used to efficiently store extra data needed
inside the depth_first_search algorithm. There are two ways to do it.
The first involves putting the index into MyV, and then explicitly
passing an index map to depth_first_search:

  struct MyV {
    int numStars;
    int index;
  };

  // after you build the graph...
  int idx = 0;
  BGL_FORALL_VERTICES(v, g, Graph)
    g[v].index = idx++;

  // calling DFS
  depth_first_search(g, visitor(star_vis).
                     vertex_index_map(get(&MyV::index, g)));

Alternatively, only could use the more traditional properties approach
for the vertex index (MyV still works like it always did!), like this:

  struct MyV {
    int numStars;
  }; // as you originally had written

  // Tweak the graph type to stick a vertex_index in each vertex
  typedef adjacency_list<setS, setS, bidirectionalS,
                          property<vertex_index, int, MyV>, MyE>
    MyGraph;

  // after you build the graph...
  int idx = 0;
  BGL_FORALL_VERTICES(v, g, Graph)
    put(vertex_index, g, v, idx++);

  // Calling DFS, as you had before:
  depth_first_search(g, visitor(star_vis));

Despite the fact that I love bundled properties for everything else, I
like the second one better because the BGL knows how to automatically
look up the vertex_index property.

  Cheers,
  Doug


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net