zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    python中重要的模块--asyncio
    Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理
    驱动精灵扩展版(集成万能网卡驱动)无法自动识别网卡的解决方案
    ROS HTB限速失败原因分析和需注意事项
    按键精灵saystring无法使用的几种解决方案
    ESXI5-WIN2008R2安装域控以及额外域笔记
    centos如何使用utc时间
    NFS的安装以及windows/linux挂载linux网络文件系统NFS
    用命令行方式关闭CentOS防火墙
    CentOS6.4 上搭建NIS网络信息服务器
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8675509.html
Copyright © 2011-2022 走看看