|
Boost Users : |
From: Doug Gregor (dgregor_at_[hidden])
Date: 2005-07-25 16:44:54
Hi Elisha,
On Jul 25, 2005, at 12:35 PM, Elisha Berns wrote:
> So lets start at the top, so that hopefully you can spot immediately
> the
> hole in my (mis)understanding here:
>
> 1) Construct a graph that is mostly, predominately, a DAG.
> 2) This graph doesn't have any valid color properties yet, because is
> hasn't been traversed in any way (this is the point that seemingly is
> hanging me up).
Here's the first minor issue. At this point, we should initialize the
color map with all white vertices.
> 3) Construct an edge filter that will eliminate edges that have the
> color 'gray'.
We want to eliminate edges whose target vertex has the color gray.
> 4) Construct a filtered_graph using the above edge filter and a copy of
> the color map from the 'original' graph that isn't quite a DAG.
> 5) Run a depth first search on the filtered graph and voila the
> resulting filtered graph will now be a DAG in depth first search order.
>
> So where do the vertices get colored gray? Presumably during the
> depth_first_search operation, right? Does that mean depth_first_search
> first colors the vertices, then calls the filtered_graph's edge
> predicate?
Yes. Check out the DFS-VISIT pseudo in the documentation here:
http://www.boost.org/libs/graph/doc/depth_first_search.html
As soon as DFS sees a vertex "u" for the first time (so u is white), it
colors it gray in the property map, then visits its out-edges. The
filtered_graph applies the filter predicate on-the-fly, so as we're
stepping through the out-edge list of the underlying graph, it's
filtering out any edges (u, v) such that v is colored gray.
It's like we took the loop from DFS-VISIT that looks like this:
for each v in Adj[u]
// do something
and made it:
for each v in Adj[u]
if color[v] != gray
// do something
> And then the filtered_graph eliminates the gray edge?
> Something's missing, but I can't quite articulate it.
I'm guessing that you're expecting that the edge filter predicate is
applied once, when the filtered_graph is constructed, instead of lazily
as we iterate through the out-edges for each vertex. It's very likely
that our documentation doesn't make this abundantly clear.
> On the other hand, if you wrote that you first run a depth_first_search
> that ignores back edges on the graph in order to first color the
> vertices, that would be clear to me. And then of course you run that
> graph with its initialized color_map through the filtered_graph using
> the edge predicate that eliminates all edges with color gray. That
> would make perfect sense to my small mind!
We might get stuck if we did this, because all vertices in the graph
could end up colored black by the depth_first_search and we'd do
nothing on the second pass.
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