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 }
原文地址:https://www.cnblogs.com/xiaochi/p/8675509.html