2018-01-12 21:47:58 +01:00
< HTML >
<!--
Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
2021-10-05 21:37:46 +02:00
2018-01-12 21:47:58 +01:00
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
< Head >
< Title > Boost Graph Library: Dijkstra Visitor< / Title >
2021-10-05 21:37:46 +02:00
< BODY BGCOLOR = "#ffffff" LINK = "#0000ee" TEXT = "#000000" VLINK = "#551a8b"
ALINK="#ff0000">
< IMG SRC = "../../../boost.png"
ALT="C++ Boost" width="277" height="86">
2018-01-12 21:47:58 +01:00
< BR Clear >
< H1 > < img src = "figs/python.gif" alt = "(Python)" / > Dijkstra Visitor Concept< / H1 >
This concept defines the visitor interface for < a
href="./dijkstra_shortest_paths.html">< tt > dijkstra_shortest_paths()< / tt > < / a >
and related algorithms. The user can create a class that matches this
interface, and then pass objects of the class into
< tt > dijkstra_shortest_paths()< / tt > to augment the actions taken during
the search.
< h3 > Refinement of< / h3 >
< a href = "../../utility/CopyConstructible.html" > Copy Constructible< / a >
(copying a visitor should be a lightweight operation).
< h3 > Notation< / h3 >
< Table >
< TR >
< TD > < tt > V< / tt > < / TD >
< TD > A type that is a model of Dijkstra Visitor.< / TD >
< / TR >
< TR >
< TD > < tt > vis< / tt > < / TD >
< TD > An object of type < tt > V< / tt > .< / TD >
< / TR >
< TR >
< TD > < tt > G< / tt > < / TD >
< TD > A type that is a model of Graph.< / TD >
< / TR >
< TR >
< TD > < tt > g< / tt > < / TD >
< TD > An object of type < tt > G< / tt > .< / TD >
< / TR >
< TR >
< TD > < tt > e< / tt > < / TD >
< TD > An object of type < tt > boost::graph_traits< G> ::edge_descriptor< / tt > .< / TD >
< / TR >
< TR >
< TD > < tt > s,u,v< / tt > < / TD >
< TD > An object of type < tt > boost::graph_traits< G> ::vertex_descriptor< / tt > .< / TD >
< / TR >
< TR >
< TD > < tt > DistanceMap< / tt > < / TD >
< TD > A type that is a model of < a href = "../../property_map/doc/ReadWritePropertyMap.html" > Read/Write Property Map< / a > .< / TD >
< / TR >
< TR >
< TD > < tt > d< / tt > < / TD >
< TD > An object of type < tt > DistanceMap< / tt > .< / TD >
< / TR >
< TR >
< TD > < tt > WeightMap< / tt > < / TD >
< TD > A type that is a model of < a href = "../../property_map/doc/ReadWritePropertyMap.html" > Readable Property Map< / a > .< / TD >
< / TR >
< TR >
< TD > < tt > w< / tt > < / TD >
< TD > An object of type < tt > WeightMap< / tt > .< / TD >
< / TR >
< / table >
< h3 > Associated Types< / h3 >
none
< p >
< h3 > Valid Expressions< / h3 >
< table border >
< tr >
< th > Name< / th > < th > Expression< / th > < th > Return Type< / th > < th > Description< / th >
< / tr >
< tr >
< td > Initialize Vertex< / td >
< td > < tt > vis.initialize_vertex(u, g)< / tt > < / td >
< td > < tt > void< / tt > < / td >
< td >
This is invoked one each vertex of the graph when it is initialized.
< / td >
< / tr >
< tr >
< td > Examine Vertex< / td >
< td > < tt > vis.examine_vertex(u, g)< / tt > < / td >
< td > < tt > void< / tt > < / td >
< td >
This is invoked on a vertex as it is popped from the queue. This
happens immediately before < tt > examine_edge()< / tt > is invoked
on each of the out-edges of vertex < tt > u< / tt > .
< / td >
< / tr >
< tr >
< td > Examine Edge< / td >
< td > < tt > vis.examine_edge(e, g)< / tt > < / td >
< td > < tt > void< / tt > < / td >
< td >
This is invoked on every out-edge of each vertex after it is discovered.
< / td >
< / tr >
< tr >
< td > Discover Vertex< / td >
< td > < tt > vis.discover_vertex(u, g)< / tt > < / td >
< td > < tt > void< / tt > < / td >
< td >
This is invoked when a vertex is encountered for the first time.
< / td >
< / tr >
< tr >
< td > Edge Relaxed< / td >
< td > < tt > vis.edge_relaxed(e, g)< / tt > < / td >
< td > < tt > void< / tt > < / td >
< td >
Upon examination, if the following condition holds then the edge
is relaxed (its distance is reduced), and this method is invoked.< br >
< tt >
tie(u,v) = incident(e, g);< br >
D d_u = get(d, u), d_v = get(d, v);< br >
W w_e = get(w, e);< br >
assert(compare(combine(d_u, w_e), d_v));< br >
< / tt >
< / td >
< / tr >
< tr >
< td > Edge Not Relaxed< / td >
< td > < tt > vis.edge_not_relaxed(e, g)< / tt > < / td >
< td > < tt > void< / tt > < / td >
< td >
Upon examination, if the edge is not relaxed (see above) then
this method is invoked.
< / td >
< / tr >
< tr >
< td > Finish Vertex< / td >
< td > < tt > vis.finish_vertex(u, g)< / tt > < / td >
< td > < tt > void< / tt > < / td >
< td >
This invoked on a vertex after all of its out edges have been added to the
search tree and all of the adjacent vertices have been discovered
(but before their out-edges have been examined).
< / td >
< / tr >
< / table >
< h3 > Models< / h3 >
< ul >
< li > < a href = "./dijkstra_visitor.html" > < tt > dijkstra_visitor< / tt > < / a >
< / ul >
< a name = "python" > < / a >
< h3 > Python< / h3 >
To implement a model of the < tt > DijkstraVisitor< / tt > concept in Python,
create a new class that derives from the < tt > DijkstraVisitor< / tt > type of
the graph, which will be
named < tt > < i > GraphType< / i > .DijkstraVisitor< / tt > . The events and syntax are
the same as with visitors in C++. Here is an example for the
Python < tt > bgl.Graph< / tt > graph type:
< pre >
class count_tree_edges_dijkstra_visitor(bgl.Graph.DijkstraVisitor):
def __init__(self, name_map):
bgl.Graph.DijkstraVisitor.__init__(self)
self.name_map = name_map
def edge_relaxed(self, e, g):
(u, v) = (g.source(e), g.target(e))
print "Relaxed edge ",
print self.name_map[u],
print " -> ",
print self.name_map[v]
< / pre >
< br >
< HR >
< TABLE >
< TR valign = top >
< TD nowrap > Copyright © 2000-2001< / TD > < TD >
< A HREF = "http://www.boost.org/people/jeremy_siek.htm" > Jeremy Siek< / A > ,
Indiana University (< A
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu< / A > )< br >
< A HREF = "http://www.boost.org/people/liequan_lee.htm" > Lie-Quan Lee< / A > , Indiana University (< A HREF = "mailto:llee@cs.indiana.edu" > llee@cs.indiana.edu< / A > )< br >
2021-10-05 21:37:46 +02:00
< A HREF = "https://homes.cs.washington.edu/~al75" > Andrew Lumsdaine< / A > ,
2018-01-12 21:47:58 +01:00
Indiana University (< A
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu< / A > )
< / TD > < / TR > < / TABLE >
< / BODY >
2021-10-05 21:37:46 +02:00
< / HTML >