boost graph_探索Boost Graph库

探索Boost Graph Library:图论在编程中的应用
本文介绍了Boost Graph Library (BGL),这是一个强大的图论库,适合将工程问题转换为图论问题。文章涵盖了如何创建无向图和有向图,遍历图,构建加权图,以及应用最小生成树和深度优先搜索算法。通过实例展示了BGL的易用性和灵活性,鼓励读者进一步探索BGL以实现复杂图算法。

发表关于计算的公理陈述通常是一个热门辩论的问题。 但是,图论是现代计算最重要的理论Struts之一,并不是其中一种说法。 从设计路由器和网络到设计构成移动设备核心的芯片的无数工程领域不过是图论的应用。

作为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版本。

邻接表

任何图实现的核心都是邻接表或矩阵。 清单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模板参数决定将使用哪种容器来存储边缘列表信息。 从图论基础上回想一下,对于有向图,所有仅具有输入边的顶点都有一个空的对应邻接表。 默认值设置为vecS ,它对应于std::vectorVertexList模板参数决定用于表示图形顶点列表的容器类型,默认容器为std::vectorDirectedS模板参数根据所提供的值是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_edgeadd_vertex等辅助函数add_vertexadd_edge函数的名称含义是:在图形的两个顶点之间添加一条边。 在清单2的执行结束时, g应该有四个标记为0、1、2和3的顶点,其中1连接到0和2,依此类推。

遍历图

遍历图涉及使用vertex_iteratoradjacency_iterator类。 前者遍历图的所有顶点;前者遍历图的所有顶点。 后者在相应的相邻顶点上迭代。 清单3显示了代码。

清单3.使用BGL遍历图
#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);
 mygraph::vertex_iterator vertexIt, vertexEnd;
 mygraph::adjacency_iterator neighbourIt, neighbourEnd;
 tie(vertexIt, vertexEnd) = vertices(g);
 for (; vertexIt != vertexEnd; ++vertexIt) 
  { 
    cout << *vertexIt << " is connected with "; 
    tie(neighbourIt, neighbourEnd) = adjacent_vertices(*vertexIt, g); 
    for (
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值