1 //#pragma warning(disable : 4819)
2
3 #include <boost/config.hpp>
4 #include <iostream> // for std::cout
5 #include <boost/graph/adjacency_list.hpp>
6 using namespace boost;
7
8 // 构造路由器网络的图模型
9 template < typename Graph, typename VertexNameMap, typename TransDelayMap >
10 void build_router_network(Graph & g, VertexNameMap name_map,
11 TransDelayMap delay_map)
12 {
13 //定义5个顶点表示路由器
14 typename graph_traits < Graph >::vertex_descriptor a, b, c, d, e;
15 //添加5个顶点到图模型中,并设置顶点的名称属性
16 a = add_vertex(g);
17 name_map[a] = 'a';
18 b = add_vertex(g);
19 name_map[b] = 'b';
20 c = add_vertex(g);
21 name_map[c] = 'c';
22 d = add_vertex(g);
23 name_map[d] = 'd';
24 e = add_vertex(g);
25 name_map[e] = 'e';
26
27 //定义边表示路由器之间的连接
28 typename graph_traits < Graph >::edge_descriptor ed;
29 bool inserted;
30 //添加顶点之间相应连接到图模型中,并设置顶点的名称属性
31 tie(ed, inserted) = add_edge(a, b, g);
32 delay_map[ed] = 1.2;
33 tie(ed, inserted) = add_edge(a, d, g);
34 delay_map[ed] = 4.5;
35 tie(ed, inserted) = add_edge(b, d, g);
36 delay_map[ed] = 1.8;
37 tie(ed, inserted) = add_edge(c, a, g);
38 delay_map[ed] = 2.6;
39 tie(ed, inserted) = add_edge(c, e, g);
40 delay_map[ed] = 5.2;
41 tie(ed, inserted) = add_edge(d, c, g);
42 delay_map[ed] = 0.4;
43 tie(ed, inserted) = add_edge(d, e, g);
44 delay_map[ed] = 3.3;
45 }
46
47 //打印图中所有顶点的名称属性
48 template < typename Graph, typename VertexNameMap >
49 void print_vertex_names(const Graph & g, VertexNameMap name_map)
50 {
51 std::cout << "vertices(g) = { ";
52 typedef typename graph_traits < Graph >::vertex_iterator iter_t;
53 for (std::pair < iter_t, iter_t > p = vertices(g); p.first != p.second;
54 ++p.first)
55 //vertices(g)返回顶点迭代器区间,遍历图g的所有顶点
56 {
57 print_vertex_name(*p.first, name_map);
58 std::cout << ' ';
59 }
60 std::cout << "}" << std::endl;
61 }
62
63 //打印图中所有边的延迟属性
64 template < typename Graph, typename TransDelayMap, typename VertexNameMap >
65 void print_trans_delays(const Graph & g, TransDelayMap trans_delay_map,
66 VertexNameMap name_map)
67 {
68 typename graph_traits < Graph >::edge_iterator first, last;
69 for (tie(first, last) = edges(g); first != last; ++first)
70 //edges(g)返回边迭代器区间,遍历图g的所有边
71 {
72 print_trans_delay(*first, g, trans_delay_map, name_map);
73 std::cout << std::endl;
74 }
75 }
76
77 //打印一个给定名称属性映射的顶点的名称
78 //v是图中有效的顶点的描述器
79 //name_map是名称属性映射
80 template < typename VertexDescriptor, typename VertexNameMap >
81 void print_vertex_name(VertexDescriptor v, VertexNameMap name_map)
82 {
83 std::cout << get(name_map, v);
84 }
85
86
87 //打印一个给定名称属性映射的顶点和边延迟属性映射的延迟值
88 //e是图g中有效的边
89 //name_map是名称属性映射
90 //delay_map是延迟属性映射
91 template < typename Graph, typename TransDelayMap, typename VertexNameMap >
92 void print_trans_delay(typename graph_traits < Graph >::edge_descriptor e,
93 const Graph & g, TransDelayMap delay_map,
94 VertexNameMap name_map)
95 {
96 std::cout << "trans-delay(" << get(name_map, source(e, g)) << ","
97 << get(name_map, target(e, g)) << ") = " << get(delay_map, e);
98 //source(e,g)和target(e,g)函数分别返回
99 //图g中e表示的边(u,v)的顶点u和v的描述器
100 }
101
102
103
104
105
106
107 //测试
108 void main()
109 {
110 //定义图类型graph_t
111 typedef adjacency_list < listS, listS, directedS,
112 property < vertex_name_t, char >,
113 property < edge_weight_t, double > > graph_t;
114
115 //定义图对象g
116 graph_t g;
117
118 //定义属性映射(顶点)name_map并初始化
119 property_map < graph_t, vertex_name_t >::type name_map =
120 get(vertex_name, g);
121
122 //定义属性映射delay_map(边)并初始化
123 property_map < graph_t, edge_weight_t >::type delay_map =
124 get(edge_weight, g);
125
126 //构造路由器网络的图模型g
127 //注意函数参数为引用传递
128 build_router_network(g, name_map, delay_map);
129
130 //打印图g所有顶点的名称属性
131 print_vertex_names(g, name_map);
132
133 //打印图g中所有边的延迟属性
134 print_trans_delays(g, delay_map, name_map);
135
136 //system("pause");
137
138 std::cin.get();
139 }