发表关于计算的公理陈述通常是一个热门辩论的问题。 但是,图论是现代计算最重要的理论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::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_vertex 。 add_edge函数的名称含义是:在图形的两个顶点之间添加一条边。 在清单2的执行结束时, g应该有四个标记为0、1、2和3的顶点,其中1连接到0和2,依此类推。
遍历图
遍历图涉及使用vertex_iterator和adjacency_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 (

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

被折叠的 条评论
为什么被折叠?



