Boost Graph Library 学习笔记

C++图常用库boost graph library 接下来一段日子,会写一些跟bgl相关的内容。bgl是一个性能很不错的库,但是源码跟鬼畜一样…文档也写得很乱。因为最近做的论文需要比较好的性能,实在不得不硬着头皮重新用起bgl。所以尽可能的做一些总结,希望能给后面需要使用的同学能有点帮助。 开始: 一个简单的小例子 {% codeblock lang:Cpp %} #include // for std::cou... 阅读详情

最近研究了一下boost graph library(简称BGL)。由于文档的过于简略和使用者数量较少,一时半会弄明白还不是那么简单的一件事情。网上也有不少入门文章,这些我就不再说了,主要说一下我遇到的一些问题。

 

1. descriptor 和 iterator的区别

BGL里有2种迭代器性质的东西,分别是descriptor和iterator。在STL里只有一种迭代器,就是iterator。但是在BGL里,多出了一种叫descriptor的东西。原因在于,图是关系型的数据结构,是非线性的,要比STL里的线性容器复杂。在STL设计中,iterator就是作用于线性容器。在BGL里保留了iterator可以说是一种习惯吧。但是光有iterator的图结构是很复杂的,原因就在于iterator失效这么一个问题。在STL里,删除一个vector中的一个元素会使此元素后面的iterator失效。当然,这种失效在线性容器中还算可以容忍。但是在图里就不行了,考虑如下例子:3个点3条边的一个图的构建,按照BGL的方式首先定义出图类型G,然后定义G的对象g。首先我们加2个点进去:1,3两个点。然后通过add_edge加边。比如在1,3两点之间加边就是add_edge(1,3)。然后再加点2,再在2,3两点之间加边add_edge(2,3)。这里的参数都是vertex_descriptor,而不是vertex_iterator。如果是iterator,在你调用add_edge(2,3)时,这个3所代表的iterator可能是已经失效的!(因为在加点2的时候,3的位置往后移动了(假设是vector))这就是descriptor存在的意义。实际上,在BGL实现里面,descriptor的类型是size_t。

另外,iterator和descriptor是无法相互转换的。

 

2. 算法的输出

最短路算法的输出是顶点序列。但如果这个图含有平行边,顶点序列是不够的。如何让算法输出边序列?下面是源代码,具体细节就不细说了,看代码一般能看出来。

 template <class PredecessorMap>
c

计算机数据结构---图(graph): Boost Graph Library 初步使用教程 (1) Boost Graph Library 是c++中实现图结构性能比较好,也比较省心的一个库,但是官方文档让人看的比较累。这里搬运油管上的一个英文视频,小哥讲的也比较清楚,大家可以去看看原视频。文中代码可以在小哥的github中找到。 使用Boost Graph Libary时需要考虑三件事情: 如何保存你的图(graph)结构 如何向节点(vertices)和边(edge)添加属性 如何获得(... 阅读详情

相关推荐

使用C++ Boost Graph Library 进行社交网络分析入门篇

前言:      社交网络分析是一个常常会遇到的业务问题,故而笔者也一致在不断尝试不同的社交网络分析工具。之前使用过python networkx, igraph C library, 今日再介绍一款C++环境下的分析工具: Boost Graph Library(下文简称BGL), 该库据说可轻松处理百万级别节点规模的网络.  业界对该款工具的评语有: 1. large, stabl

a_step_further的博客 3989

Boost Graph Library

Boost Graph Library 关于计算的公理表达通常颇具争论。然而,现代计算最重要的理论支柱之一的图论并不是这些公理表达之一。无数工程领域(从设计路由器和网络到设计构成移动设备核心的芯片)都是图论的应用。 作为C++应用程序软件开发人员,我们通常需要直接将实际工程问题转化成一个等价的图论问题。如果有一个可靠的基于C++的通用图库,就可以帮助我们实现这个转换,这样的图库显然非常...

Augusdi的专栏 1421

基于 Boost Graph Library 的 DFS 算法扩展与环路径搜索

基于 C++ boost 开发工具,以其 BGL 的高效算法和数据结构为基础,通过深度优先算法(DFS)找环的方法,方法是对经典的深度优先算法进行扩充,增加环检测并输出环路径,主要思想是如果触发了DFS算法的反向边事件,则图中一定存在环,因此,在DFS算法的事件遍历器中特定事件点增加扩充代码即可。具体地,在树边事件中增加前趋边的记录,在反向边事件中根据末节点与前趋边记录给出街搜环的路径。

clulifeng的博客 812

Boost Graph Library 快速入门

Boost Graph Library快速入门 图领域的数据结构和算法在某些方面比容器更为复杂,图算法在图中移动有着众多的路线,而STL使用的抽象迭代器接口不能有效的支持这些。作为替换,我们为图提供了一个的抽象的结构,其与容器迭代器的目的类似(尽管迭代器扮演着更大的角色)。图1 描述了STL 和BGL 之间的对比。 图1: The...

飘过的春风 1万+

Boost Graph Library-BGL学习笔记1

首先需要说明的是BGL是一个增强STL map的通用类库,这个库是一个仅有header文件的C++库,不需要分开编译。我发现很多文章上来就讲怎么用,其实安装和导入可能会让一些人卡一会儿,做法也比较简单,就是在搜索路径中加入我们下载解压的文件路径就可以了。比如我的文件位置在下图: 因为我是用VS2017编译运行的,我只要右键项目->>属性->>C++->>常规->>附加包含目录处双击填入上面蓝色链接路径即可: 完成后效果如上图。 接下来我们跑一下官

梓潼的优化空间 1137

boost graph_探索Boost Graph

发表关于计算的公理陈述通常是一个热门辩论的问题。 但是,图论是现代计算最重要的理论Struts之一,并不是其中一种说法。 从设计路由器和网络到设计构成移动设备核心的芯片的无数工程领域不过是图论的应用。 作为C++应用程序软件开发人员,我们经常直接需要将实际的工程问题转换为等效的图论问题。 拥有一个强大的基于C++的通用图形库可以帮助我们做到这一点显然是值得欢迎的:Boost Graph L...

cusi77914的博客 2661

Boost Graph Library基础用法说明

linux下安装Boost库 apt-get install libboost-dev 新建图(邻接表建图) #include <boost/graph/adjacency_list.hpp> using namespace boost; int main() { //1.新建无向图,使用邻接矩阵数据结构 boost::adjacency_list<listS, vecS, undirectedS> g;//listS是每个顶点的链表,用于表示与该顶点相连的所有顶点 //VecS是

Savage888777的博客 635

Boost Graph Library (BGL)学习:使用Bundled Properties

// 所有原创文章转载请注明作者及链接// blackboycpp(AT)gmail.com// QQ群: 135202158  /* * 文件: Unit1.cpp * 日期: 2008-12-31 8:59:53 * 作者: blackboy * 描述: BGL学习 - 使用Bundled Properties */ //--

blackboy的技术博客 3649

(转)Boost Graph Library 快速入门

(转)Boost Graph Library 快速入门 <br />翻译的中文原文见:http://blog.csdn.net/delphihero/archive/2006/05/24/752765.aspx,英文源文见:http://www.boost.org/libs/graph/doc/quick_tour.html。<br />   图领域的数据结构和算法在某些方面比容器更为复杂,图算法在图中移动有着众多的路线,而STL使用的抽象迭代器接口不能有效的支持这些。作为替换,我们为图提供了一个的抽象的结

preciousboy的专栏 819

使用Boost Graph library

本文翻译自"Manipulating C++ Graph Data Structures with the Boost Graph Library",原文请见:http://www.informit.com/articles/article.asp?p=673259&seqNum=4  使用Boost创建一个简单的图如果你不得不使用图算法,你要么自己构建图数据结构,或者

jjqtony的专栏 5559

Boost Graph Library:C++ 图论算法的高效封装工具,采用 BGL 的多路径分离算法

​ 以  Boost Graph Library 库为基础,完成最短路径算法(dijkstra)的更多改进算法 ,讨论寻找第 2 短路径的算法流程及代码,两条最短路径支持边分离策略及节点分离策略。

clulifeng的博客 1078

Boost Graph Library 库小结1

Boost Graph Library使用泛型的思想,完整的编写了图中的各类算法。比如广搜,深搜,最短路径等等 1.创建一个图 1.1 图的表示 图可以有邻接矩阵和邻接表来表示,而在BGL中,则使用adjacency_list和adjacency_matrix来表示,adjacency_list使用邻接表来存储一个图,而adjacency_matrix使用邻接矩阵来存储,分别适用...

weixin_33753003的博客 298

使用boost graph library计算图中点和边的betweenness

项目中用到的东西,betweenness是社交网络里的概念。基于的思想是betweenness高的点和边在网络中更重要。betweenness具体定义见这里 搜了一下发现boost已经有实现,但是用起来也真是费了牛劲。模版类一不小心就写错,而且编译出错信息完全看不出来什么。 搜了文档和例子才算写好了。。 下面是一个星状图的例子: input: 0 1 1 // an edge from 0

zzucaicai的专栏 1778
上一篇: 从C++与Unicode说开去
magicblue
博客等级 码龄26年 3粉丝 30原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值