Boost logo

Boost Users :

Subject: Re: [Boost-users] Confused with Depth-First-Search method, forwardor cross edge found on a undirected graph ?
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2013-06-25 15:34:36


On Tue, 25 Jun 2013, lizy10b wrote:

> Hi Jeremiah Willcock,
>    Can I use the predecessor_map in undirected_dfs() like in dijkstra_shortest_paths()?
> undirected_dfs(g, predecessor_map(&p[0]).root_vertex(vertex_descriptor(0)).visitor(vis)
>                  .edge_color_map(get(edge_color, g)).vertex_color_map(get(vertex_color, g)));
> It does not work on my end, all elements in predecessor remain 0 after invoke the undirected_dfs() .

If that parameter isn't in the documentation for undirected_dfs, the
argument will just be ignored.

> In the last section (Extending Algorithms with Visitors) of http://www.boost.org/doc/libs/1_53_0/libs/graph/doc/quick_tour.html,
> an example shows how to write a predecessor_map using visitor,
> and the "event point" is edge_relaxed().
> But as the undirected_dfs document shows there is no edge_relaxed() for DFS.

> So is there any way to save predecessors in DFS?
> For example an edge (u,v) and start at vertex u

> When the discover_vertex(Vertex, Graph&) is invoked at vertex v, then
> inside the discover_vertex() how could I know the previous discovered
> vertex is u?

I believe you would want to hook tree_edge() instead of edge_relaxed().

-- Jeremiah Willcock

>
> _________________________________________________________________________________________________________________________________________________________
> 发件人: Jeremiah Willcock
> 发送时间: 2013-06-25  00:44:05
> 收件人: lizy10b
> 抄送: boost-users
> 主题: Re: Re: [Boost-users] Confused with Depth-First-Search method,forwardor cross edge found on a undirected graph ?
> On Tue, 25 Jun 2013, lizy10b wrote:
> > Hi Jeremiah Willcock ,
> > ?
> > It seems undirected_dfs() works. I have not燾heck the result according to the graph, but at least there is no
> > forward edge or cross edge output.
> > Attached is the revised cpp file using undirected_dfs() .
> > My question is why edge_color_map(get(edge_color,爂))?is required when calling the undirected_dfs() .
> > Thanks
> It looks like what is going wrong with using directed DFS is that edges 
> are examined twice (once in each direction), and so you can have forward 
> edges even in a symmetric graph (which is how undirected graphs are 
> treated in directed-graph algorithms in BGL).  An example is the triangle 
> 0 -- 1 -- 2 -- 0: starting at 0 and processing the edges out of a vertex 
> in numerical order, 0 -> 1 is a tree edge, 1 -> 0 is a back edge, 1 -> 2 
> is a tree edge, 2 -> 0 is a back edge, 2 -> 1 is a back edge, then 0 -> 2 
> is a forward edge.  An undirected DFS would mark 2 -> 0 as a back edge 
> then ignore 0 -> 2 since it is the same as 2 -> 0.  The edge colors in 
> undirected_dfs are used to do this filtering-out of multiple directions 
> for the same edge.
> -- Jeremiah Willcock
>
>


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