22.boost圖模板

  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 }
相關文章
相關標籤/搜索