图论是一种数学抽象,它对于解决多种计算机科学问题是非常有用的,   Boost.Graph提供了一个基于图论的通用编程接口.
      Boost.Graph是一个图的封装,在《数据结构》的教科书里,一般都会讲到数组、链表、队列、堆栈、堆、树、图论等。其中前面几个已经在C++标准库(STL)中实现了(如vector,list,stack,queue,heap等),却没有提供一个与树或图对应的实现,实在说不过去。于是这个艰巨而又光荣的任务就落到了作为标准库的预备役的Boost身上, Boost.Graph诞生啦!
      Boost.Graph分成数据结构和算法两个大部分(为了便于区分,后文称"图结构"和"图算法"),其中"图结构"相当于 STL里的容器,自带了邻接表(adjacency_list)、邻接矩阵(adjacency_matrix)和CSR图 (compressed_sparse_row_graph)三种。“图算法”相当于STL里的算法,就象std::sort不能用于std::list 一样,对于不同的“图结构”,“图算法”也有不同的适用范围。
“图算法”的适用范围按“概念(Concept)”划分,“图结构”根据它的结构特点被分为“可变图”、“关联图”、“双向图”、“邻接图”、“点表 图”、“边表图”、“属性图”、“可变属性图”几个概念。一种“图结构”可能支持其中的一部分概念而不支持其它的概念,于是也就决定了这种“图结构”所支 持的“图算法”。

图的概念以及对应的算法:

表格中g为图对象,u,v为源和目标顶点,e为边,iter为边的迭代器类型,p为谓词函数(或函数对象)

概念 Concept 支持函数
可变图(Mutable Graph)
允许添加、删除顶点和边
std::pair<edge_descriptor,bool>
    add_edge(u, v, g);
加入一条边,返回加入后的边以及是否成功。
(若边已存在且不允许并行边,则返回已存在的边)
void remove_edge(u, v, g); 删除连接u和v的边
void remove_edge(e, g); 同上
void remove_edge(iter, g); 同上
void remove_edge_if(p, g); 删除所有谓词p为true的边
void remove_out_edge_if(u, p, g); 删除所有谓词p为ture的出边
void remove_in_edge_if(u, p, g); 删除所有谓词p为trre的入边
vertex_descriptor add_vertex(g); 添加一个顶点,返回加入的顶点
void clear_vectex(u, g); 删除u上的所有边
void remove_vectex(u, g); 删除顶点u,注意删除顶点之前要确保该顶点没有边与之连接,否则会出现未定义的行为。典型的用法是在 remove_vectex前调用clear_vectex。
关联图(Incidence Graph)
vertex_descriptor source(e, g); 返回e边上的起源顶点
vertex_descriptor target(e, g); 返回e边上的目标顶点
std::pair<out_edge_iterator, out_edge_iterator>
    out_edges(u, g);
以边迭代器对的形式返回顶点u上的所有出边
degree_size_type out_degree(u, g); 返回顶点u的出度
双向图(Bidirectional Graph)
std::pair<in_edge_iterator, in_edge_iterator>
    in_edges(v, g)
以边迭代器对的形式返回顶点v上的所有入边
degree_size_type in_degree(v, g) 返回顶点v的入度
degree(v, g) 返回入度+出度
邻接图(Adjacency Graph)
std::pair<adjacency_iterator, adjacency_iterator>
    adjacent_vertices(v, g)
以顶点迭代器范围的形式返回顶点v上的所有邻接点。
点表图(Vertex List Graph)
std::pair<vertex_iterator, vertex_iterator>
   vertices(g)
以顶点迭代器范围的形式返回所有顶点
vertices_size_type num_vertices(g) 返回顶点数
边表图(Edge List Graph)
std::pair<edge_iterator, edge_iterator>
   edges(g);
以边迭代器的形式返回所有边
edges_size_type num_edges(g); 返回边数
vertex_descriptor source(e, g); 返回e边上的起源顶点
vertex_descriptor target(e, g); 返回e边上的目标顶点
属性图(Property Graph)
可以为每个顶点和边加入附加属性
get(p, g) 得到图g的属性p的值
get(p, g, x) 得到顶点或边x的属性p的值
put(p, g, x, v) 设置属性值
可变属性图(Mutable Property Graph)
std::pair<edge_descriptor, bool>
    add_edge(u, v, ep, g)
加入边,顺便给属性ep赋值
vertex_descriptor add_vertex(vp, g) 加入顶点,顺便给属性vp赋值

Boost--Graph相关推荐

  1. boost::graph::distributed::mpi_process_groupboost::graph::用法的测试程序

    boost::graph::distributed::mpi_process_groupboost::graph::用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::di ...

  2. boost::graph::distributed::hohberg_biconnected_components用法的测试程序

    boost::graph::distributed::hohberg_biconnected_components用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::dis ...

  3. boost::graph::distributed::distributed_queue用法的测试程序

    boost::graph::distributed::distributed_queue用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::distributed::dis ...

  4. boost::graph::page_rank用法的测试程序

    boost::graph::page_rank用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::page_rank用法的测试程序 C++实现代码 #include < ...

  5. boost::graph::dimacs_basic_reader用法的测试程序

    boost::graph::dimacs_basic_reader用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::dimacs_basic_reader用法的测试程序 ...

  6. boost::graph模块实现分布式压缩稀疏行图类型的测试

    boost::graph模块实现分布式压缩稀疏行图类型的测试 实现功能 C++实现代码 实现功能 boost::graph模块实现分布式压缩稀疏行图类型的测试 C++实现代码 #include < ...

  7. boost::graph::distributed用法的测试程序

    boost::graph::distributed用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::distributed用法的测试程序 C++实现代码 #include ...

  8. boost::graph模块实现广度优先搜索算法的使用示例

    boost::graph模块实现广度优先搜索算法的使用示例 实现功能 C++实现代码 实现功能 boost::graph模块实现广度优先搜索算法的使用示例 C++实现代码 #include <b ...

  9. boost::graph::isomorphism用法的测试程序

    boost::graph::isomorphism用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::isomorphism用法的测试程序 C++实现代码 #include ...

  10. boost::graph模块实现Graphviz DOT 语言阅读器

    boost::graph模块实现Graphviz DOT 语言阅读器 实现功能 C++实现代码 实现功能 boost::graph模块实现Graphviz DOT 语言阅读器 C++实现代码 #def ...

最新文章

  1. 自动驾驶车辆何时实现?近期不会实现的五大原因
  2. 粒子物理标准模型错了?电子“表哥”磁性超出理论预计,物理学家找到未知粒子存在证据...
  3. FAST300M无线宽带路由器FW300R(从)桥接TPLINK路由器(主)
  4. 新年巨献!祝所有朋友新一年闪闪发光
  5. Java中Filter、Listener,拦截器的学习,listener、 filter、servlet 加载顺序及其详解
  6. Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析
  7. 分布式开放消息系统 ( RocketMQ ) 的原理与实践
  8. 智慧零售erp通用版管理系统+门店管理+商品管理+厂商管理+财务管理+销售管理+仓储管理+Axure高保真交互ERP通用版零售行业web端简易版管理系统
  9. [SHOI2015] 超能粒子炮·改
  10. 机器视觉:PCI和PCI-E总线简介
  11. python零基础能学吗-python 零基础该怎么学?
  12. Flex 4 的ComboBox下拉框滚动条Scroller(VerticalScrollBar)的thumb过小问题的解决
  13. 【day4】【洛谷算法题】-P5708三角形面积-刷题反思集[入门1顺序结构]
  14. 二年级上册计算题_二年级数学脱式计算题600道
  15. 微服务中的服务发现是什么?
  16. wincc7.3与MYSQL_Wincc7.3学习之——如何建立起数据库链接
  17. 用c语言写鸡兔同笼问题
  18. 网站长尾关键词怎么布局 提升搜索排名
  19. 探究 PHP_CodeSniffer 的代码静态分析原理
  20. 计算机技术应用体验,2018教师信息技术应用体验学习个人心得体会2篇

热门文章

  1. 语义SLAM开源代码汇总
  2. 用OpenCV实现超轻量的NanoDet目标检测模型!
  3. 李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪
  4. TypeError: Caught TypeError in DataLoader worker process 0.
  5. 【错误总结】LaTex Warning: citation undefined
  6. 决策树算法(六)——构建决策树
  7. 拿到offer可以不去吗_2020应届毕业生求职难吗?不难!教你四招,拿到心动的Offer...
  8. 积微论坛报告视频+PPT:用微生物组时序数据重现生物膜装配动态过程
  9. NAR:宏基因组网络分析工具MetagenoNets
  10. 【疯狂的消化之旅】消化系统简介