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 }