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 <fstream> // for file I/O
9 #include <boost/graph/graphviz.hpp> // for read/write_graphviz()
10 #include <boost/graph/dijkstra_shortest_paths.hpp>
11 #include <boost/lexical_cast.hpp>
19 BOOST_INSTALL_PROPERTY(graph
, color
);
22 int main(int argc
, const char** argv
)
24 using namespace boost
;
25 typedef adjacency_list
< vecS
, vecS
, directedS
,
26 property
< vertex_name_t
, std::string
>,
27 property
< edge_color_t
, std::string
, property
< edge_weight_t
, int > >,
28 property
< graph_color_t
, std::string
> >
32 dynamic_properties
dp(ignore_other_properties
);
33 dp
.property("node_id", get(vertex_name
, g_dot
));
34 dp
.property("label", get(edge_weight
, g_dot
));
35 dp
.property("color", get(edge_color
, g_dot
));
37 ref_property_map
< g_dot_type
*, std::string
>(
38 get_property(g_dot
, graph_color
)));
40 std::ifstream
infile(argc
>= 2 ? argv
[1] : "figs/ospf-graph.dot");
41 read_graphviz(infile
, g_dot
, dp
);
44 typedef adjacency_list
< vecS
, vecS
, directedS
, no_property
,
45 property
< edge_weight_t
, int > >
47 typedef graph_traits
< Graph
>::vertex_descriptor vertex_descriptor
;
48 Graph
g(num_vertices(g_dot
));
49 graph_traits
< g_dot_type
>::edge_iterator ei
, ei_end
;
50 for (boost::tie(ei
, ei_end
) = edges(g_dot
); ei
!= ei_end
; ++ei
)
52 int weight
= get(edge_weight
, g_dot
, *ei
);
53 property
< edge_weight_t
, int > edge_property(weight
);
54 add_edge(source(*ei
, g_dot
), target(*ei
, g_dot
), edge_property
, g
);
57 vertex_descriptor router_six
;
58 graph_traits
< g_dot_type
>::vertex_iterator vi
, vi_end
;
59 for (boost::tie(vi
, vi_end
) = vertices(g_dot
); vi
!= vi_end
; ++vi
)
60 if ("RT6" == get(vertex_name
, g_dot
, *vi
))
66 std::vector
< vertex_descriptor
> parent(num_vertices(g
));
67 // All vertices start out as there own parent
68 typedef graph_traits
< Graph
>::vertices_size_type size_type
;
69 for (size_type p
= 0; p
< num_vertices(g
); ++p
)
72 #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
73 std::vector
< int > distance(num_vertices(g
));
74 property_map
< Graph
, edge_weight_t
>::type weightmap
= get(edge_weight
, g
);
75 property_map
< Graph
, vertex_index_t
>::type indexmap
= get(vertex_index
, g
);
76 dijkstra_shortest_paths(g
, router_six
, &parent
[0], &distance
[0], weightmap
,
77 indexmap
, std::less
< int >(), closed_plus
< int >(),
78 (std::numeric_limits
< int >::max
)(), 0, default_dijkstra_visitor());
80 dijkstra_shortest_paths(g
, router_six
, predecessor_map(&parent
[0]));
83 graph_traits
< g_dot_type
>::edge_descriptor e
;
84 for (size_type i
= 0; i
< num_vertices(g
); ++i
)
87 e
= edge(parent
[i
], i
, g_dot
).first
;
88 put(edge_color
, g_dot
, e
, "black");
91 get_property(g_dot
, graph_color
) = "grey";
93 std::ofstream
outfile(argc
>= 3 ? argv
[2] : "figs/ospf-sptree.dot");
94 write_graphviz_dp(outfile
, g_dot
, dp
);
97 std::ofstream
rtable(argc
>= 4 ? argv
[3] : "routing-table.dat");
98 rtable
<< "Dest Next Hop Total Cost" << std::endl
;
99 for (boost::tie(vi
, vi_end
) = vertices(g_dot
); vi
!= vi_end
; ++vi
)
100 if (parent
[*vi
] != *vi
)
102 rtable
<< get(vertex_name
, g_dot
, *vi
) << " ";
103 vertex_descriptor v
= *vi
, child
;
105 property_map
< Graph
, edge_weight_t
>::type weight_map
106 = get(edge_weight
, g
);
109 path_cost
+= get(weight_map
, edge(parent
[v
], v
, g
).first
);
112 } while (v
!= parent
[v
]);
113 rtable
<< get(vertex_name
, g_dot
, child
) << " ";
114 rtable
<< path_cost
<< std::endl
;