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 }