Boost Graph Library一个通用图库用于C++开发人员

关于计算的公理表达通常颇具争论。然而,现代计算最重要的理论支柱之一的图论并不是这些公理表达之一。无数工程领域(从设计路由器和网络到设计构成移动设备核心的芯片)都是图论的应用。

作为 C++++ 应用程序软件">开发人员,我们通常需要直接将实际工程问题转化成一个等价的图论问题。如果有一个可靠的基于 C++ 的通用图库,就可以帮助我们实现这个转换,这样的图库显然非常受欢迎:Boost Graph Library (BGL) 将填补这项空白。

在本文中,您首先将创建一个无向图,然后按照常规的遍历例程创建一个有向图。随后,您可以应用一些经典算法,所有算法都不需要添加大量代码。这就是 BGL 的神奇之处。

下载和安装

BGL 可从 Boost 网站免费下载。BGL 是一个仅有头文件的库,因此,以后在应用程序代码中使用该库时,需要在源代码中包含相关的头文件。但是 BGL 需要这个序列化库来进行链接。以下是一个典型的命令行格式:

root# g++ test_bgl.cpp I/usr/boost/boost_1_44/ -L/usr/boost/boost_1_44/lib

如果要试验本文中的代码,您需要安装 Boost 1.44 版本。

邻接表(Adjacency lists)

任何图实现的头文件中都有一个邻接表 (adjacency list) 或邻接矩阵。清单 1 显示了在 Boost 头文件 adjacency_list.hpp 中如何声明邻接表。

清单 1. 在 Boost 中声明一个邻接表

template <class OutEdgeListS = vecS, // a Sequence or an AssociativeContainer class VertexListS = vecS, // a Sequence or a RandomAccessContainer class DirectedS = directedS, class VertexProperty = no_property, class EdgeProperty = no_property, class GraphProperty = no_property, class EdgeListS = listS> class adjacency_list { };

为了简便起见,我们将重点放在前三个模板参数。

OutEdgeList 模板参数决定了将用于存储边列表( edge-list)信息的容器类型。回顾一下图论基础知识就可以知道,对于有向图,只具有入边的那些顶点都有一个对应的空邻接表。默认值被设置为 vecS,该值对应于 std::vector。VertexList 模板参数决定了用于表示该图顶点列表的容器类型,默认值同样被设置为 std::vector。DirectedS 模板参数根据提供的值是 directedS 还是 undirectedS 来确定该图是有向图还是无向图。

在 BGL 中创建一个图

在声明邻接表的同时,清单 2 中的代码在 BGL 中创建了一个简单的无向图,边信息将存储在 std::list 中,顶点信息存储在 std::vector 中。

清单 2. 创建一个无向图

#include <boost/graph/adjacency_list.hpp> using namespace boost; typedef boost::adjacency_list<listS, vecS, undirectedS> mygraph; int main() { mygraph g; add_edge (0, 1, g); add_edge (0, 3, g); add_edge (1, 2, g); add_edge (2, 3, g); }

在清单 2 中,在没有在构造函数中提供任何顶点或边信息的情况下创建了图 g。在运行的时候,会使用诸如 add_edge 和 add_vertex 之类的帮助函数创建边和顶点。add_edge 函数,顾名思义:在一个图的两个顶点之间添加一条边。清单 2 中的代码执行结束后,图 g 应该有 4 个顶点,分别标记为 0、1、2 和 3,顶点 1 与顶点 0 和顶点 2 连接,等等。

时间: 2024-11-02 00:38:30

Boost Graph Library一个通用图库用于C++开发人员的相关文章

JUnit一个回归测试框架用于Java开发人员编写单元测试

通过本文的介绍,您可以了解到什么是 Jhttp://www.aliyun.com/zixun/aggregation/29926.html">Unit,它有什么用处,JUnit 4.10 有什么新特性,并且如何应用. JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),主要供 Java 开发人员编写单元测试.在极限编程和重构中被极力推荐使用的一个工具,因为它可以大大地提高开发的效率.那么大家就

一个月内从零开始做webOS开发人员

译文链接:一个月内从零开始做webOS开发人员

设计并实现用于ASP.NET一个通用的数据存取层应用程序

asp.net|程序|设计|数据 Designing and implementing a versatile data access tier for an ASP.NET applicationBy Paul Abarham In this article, we will drill down deeper in to the design of a n-tier architecture and our focus will be on the data access tier (DAT

打造一个通用ASP.NET数据分页控件

asp.net|分页|控件|数据 对于几乎所有的数据表现Web应用来说,组织好数据的显示方式.避免给用户带来混乱的感觉就是最主要的目标之一.每个页面显示20条记录当然是可以接受的,但每页显示10000条记录就很容易给用户带来不便了.将数据分成多个页面显示,即对数据进行分页,是解决此类问题的最常见的办法. 一.慨述 ASP.NET本身只提供了一个支持数据分页的控件,即DataGrid分页控件,不过它比较适合Intranet环境使用,对于Internet环境来说,DataGrid分页控件提供的功能似

一个通用数据库显示程序,能调任意库,任意字段,多关键字搜索,自动分页

程序|分页|关键字|数据|数据库|显示 . 阿余经常写一些数据库相关的程序,当然离不开显示库中的数据了,说实话,做这样的程序真是无聊啊,所以,阿余就想写个函数,一个通用的数据库显示函数.要求如下: 1. 能显示指定的字段,当然,字段名和显示的文字可以不一样.2. 能同时按多个字段进行查询,支持模糊和精确两种查询方式.3. 有横向排列和纵向排列字段两种显示方式.4. 能自动分页.5. 能设定每页显示多少条记录.好啦,要求大至就是这样了.根据这个要求,阿余写了下面的函数.实际上,这里阿余写了两个函数

一个通用数据库显示程序

程序|数据|数据库|显示 阿余经常写一些数据库相关的程序,当然离不开显示库中的数据了,说实话,做这样的程序真是无聊啊,所以,阿余就想写个函数,一个通用的数据库显示函数.要求如下: 1. 能显示指定的字段,当然,字段名和显示的文字可以不一样.2. 能同时按多个字段进行查询,支持模糊和精确两种查询方式.3. 有横向排列和纵向排列字段两种显示方式.4. 能自动分页.5. 能设定每页显示多少条记录.好啦,要求大至就是这样了.根据这个要求,阿余写了下面的函数.实际上,这里阿余写了两个函数.一个是TABDI

PHP跳转函数和一个通用的操作提示类的编写

PHP 跳转,即重定向浏览器到指定的 URL,是一个很常见的功能.这种功能也有一些细节性的要求,比如等待多少秒以后跳转,用不用JavaScript实现跳转,等等.下面的跳转方法考虑到很多,并参数化,可以用到具体的项目当中. <?php /** * 重定向浏览器到指定的 URL * * @param string $url 要重定向的 url * @param int $delay 等待多少秒以后跳转 * @param bool $js 指示是否返回用于跳转的 JavaScript 代码 * @p

写一个通用的代码生成器

       代码生成器对于JAVA码农来说并不陌生.在一些业务性比较强,但编码比较规范的项目中,往往会有大量的重复或者类似的代码要写.比如对表的增删改查,比如生成用于远程调用的客户端方法存根等等.面对这种情况,程序员通常的做法就是拿一个现成模块的代码copy过来再改改.于是,为了避免这种低效而容易出错的编码方式,诞生了各种各样的能跟据当前项目特证自动生成代码的代码生成器程序.这种程序的本质上就是将大量重复的复制修改工作用程序自动来做,以便自动产生适合自己项目的代码.        然而,这种代

一个通用的DataGridTableStyle的做法

datagrid 一个通用的DataGridTableStyle的做法 哈,这两天都喜欢写"通用"的东西. 这个类,可以实现自适应列宽.只读.时分显示.事件.任意位置加列.单击单元格背景色设置等等,操作简便.只是时间关系(明天要出去一趟),今天没办法完善.仅供参考,你可以加入别的东西.以下只列代码了,不清楚的自己试用查资料就行了. Public Class TableStyle Private m_DataGridTableStyle As DataGridTableStyle Pri