1 //=======================================================================
2 // Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee,
4 // Distributed under the Boost Software License, Version 1.0. (See
5 // accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 //=======================================================================
8 #include <boost/config.hpp>
11 #include <boost/graph/adjacency_list.hpp>
12 #include <boost/graph/depth_first_search.hpp>
13 #include <boost/graph/graphviz.hpp>
14 #include <boost/graph/copy.hpp>
15 #include <boost/graph/reverse_graph.hpp>
18 main(int argc
, char *argv
[])
21 std::cerr
<< "usage: reachable-loop-tail.exe <in-file> <out-file>"
25 using namespace boost
;
27 read_graphviz(argv
[1], g_in
);
29 typedef adjacency_list
< vecS
, vecS
, bidirectionalS
,
30 GraphvizVertexProperty
,
31 GraphvizEdgeProperty
, GraphvizGraphProperty
> Graph
;
35 graph_traits
< GraphvizDigraph
>::vertex_descriptor loop_tail
= 6;
36 typedef color_traits
< default_color_type
> Color
;
39 std::vector
< default_color_type
> reachable_to_tail(num_vertices(g
));
40 reverse_graph
< Graph
> reverse_g(g
);
41 depth_first_visit(reverse_g
, loop_tail
, default_dfs_visitor(),
42 make_iterator_property_map(reachable_to_tail
.begin(),
43 get(vertex_index
, g
), c
));
45 std::ofstream
loops_out(argv
[2]);
46 loops_out
<< "digraph G {\n"
47 << " graph [ratio=\"fill\",size=\"3,3\"];\n"
48 << " node [shape=\"box\"];\n" << " edge [style=\"bold\"];\n";
50 property_map
<Graph
, vertex_attribute_t
>::type
51 vattr_map
= get(vertex_attribute
, g
);
52 graph_traits
< GraphvizDigraph
>::vertex_iterator i
, i_end
;
53 for (tie(i
, i_end
) = vertices(g_in
); i
!= i_end
; ++i
) {
54 loops_out
<< *i
<< "[label=\"" << vattr_map
[*i
]["label"]
56 if (reachable_to_tail
[*i
] != Color::white()) {
57 loops_out
<< ", color=\"gray\", style=\"filled\"";
61 graph_traits
< GraphvizDigraph
>::edge_iterator e
, e_end
;
62 for (tie(e
, e_end
) = edges(g_in
); e
!= e_end
; ++e
)
63 loops_out
<< source(*e
, g
) << " -> " << target(*e
, g
) << ";\n";