boost graph
Boost Graph provides tools to work with graphs. Graphas are two-dimensional point clouds with any number of lines between ponts.
Vertices and Edges
1 adjacency_list
#include <boost/graph/adjacency_list.hpp>
#include <iostream> int main() {
boost::adjacency_list<> g; boost::adjacency_list<>::vertex_descriptor v1 = boost::add_vertex(g);
boost::adjacency_list<>::vertex_descriptor v2 = boost::add_vertex(g);
boost::adjacency_list<>::vertex_descriptor v3 = boost::add_vertex(g);
boost::adjacency_list<>::vertex_descriptor v4 = boost::add_vertex(g); std::cout << v1 << ", " << v2 << ", " << v3 << ", " << v4 << std::endl;
return ;
}
输出 0, 1, 2, 3
boost::adjacency_list is a template that is instantiated with default parameters. boost::add_vertex() adds a point to a graph. boost::add_vertex() returns an object of type boost::adjacency_list::vertex_descriptor. This object represents a newly added point in the graph.
std::vector is the container boost::adjacency_list uses by default to store points. In this case, boost::adjacency_list::vertex_descriptor is a type definition for std::size_t. Because other containers can be used to store points, boost::adjacency_list::vertex_descriptor isn't necessarily always std::size_t.
2. vertices()
#include <boost/graph/adjacency_list.hpp>
#include <utility>
#include <algorithm>
#include <iterator>
#include <iostream> int main() {
boost::adjacency_list<> g; boost::add_vertex(g);
boost::add_vertex(g);
boost::add_vertex(g);
boost::add_vertex(g); std::pair<boost::adjacency_list<>::vertex_iterator, boost::adjacency_list<>::vertex_iterator> vs = boost::vertices(g); std::copy(vs.first, vs.second, std::ostream_iterator<boost::adjacency_list<>::vertex_descriptor>{std::cout, "\n"}); return ;
}
To get all points from a graph, call boost::vertices(). This function returns two iterators of type boost::adjacency_list::vertex_iterator, which refer to the beginning and ending points.
3. edges()
#include <boost/graph/adjacency_list.hpp>
#include <utility>
#include <algorithm>
#include <iterator>
#include <iostream> int main() {
boost::adjacency_list<> g; boost::adjacency_list<>::vertex_descriptor v1 = boost::add_vertex(g);
boost::adjacency_list<>::vertex_descriptor v2 = boost::add_vertex(g);
boost::add_vertex(g);
boost::add_vertex(g); std::pair<boost::adjacency_list<>::edge_descriptor, bool> p = boost::add_edge(v1, v2, g);
std::cout.setf(std::ios::boolalpha);
std::cout << p.second << std::endl; p = boost::add_edge(v1, v2, g);
std::cout << p.second << std::endl; p = boost::add_edge(v2, v2, g);
std::cout << p.second << std::endl; std::pair<boost::adjacency_list<>::edge_iterator, boost::adjacency_list<>::edge_iterator> es = boost::edges(g); std::copy(es.first, es.second, std::ostream_iterator<boost::adjacency_list<>::edge_descriptor>{std::cout, "\n"}); return ;
}
输出:
true
true
true
(0,1)
(0,1)
(1,0)
You call boost::add_edge() to connect two points in a graph. You have to pass the points and the graph as parameters. boost::add_edge() returns a std::pair. first provides access to the line. second is a bool variable that indicates whether the line was successfully added.
boost::edges() provides access to all lines in a graph. boost::edges() returns two iterators that refer to the beginning and ending lines. lines start at the first point, one at the second. The direction of the lines depends on the order of the parameters passed to boost::add_edge().
As you see, you can have multiple lines between the same two points.
4. boost::adjacency_list with selectors
#include <boost/graph/adjacency_list.hpp>
#include <utility>
#include <algorithm>
#include <iterator>
#include <iostream> int main() {
typedef boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS> graph;
graph g; boost::adjacency_list<>::vertex_descriptor v1 = boost::add_vertex(g);
boost::adjacency_list<>::vertex_descriptor v2 = boost::add_vertex(g);
boost::add_vertex(g);
boost::add_vertex(g); std::pair<boost::adjacency_list<>::edge_descriptor, bool> p = boost::add_edge(v1, v2, g);
std::cout.setf(std::ios::boolalpha);
std::cout << p.second << std::endl; p = boost::add_edge(v1, v2, g);
std::cout << p.second << std::endl; p = boost::add_edge(v2, v2, g);
std::cout << p.second << std::endl; std::pair<boost::adjacency_list<>::edge_iterator, boost::adjacency_list<>::edge_iterator> es = boost::edges(g); std::copy(es.first, es.second, std::ostream_iterator<boost::adjacency_list<>::edge_descriptor>{std::cout, "\n"}); return ;
}
By default, boost::adjacency_list uses std::vector for points and lines. By passing boost::setS as the first template parameter, std::set is selected as the container for lines.
The second template parameter tells boost::adjacency_list which class should be used for points.
The third template parameter determines whether lines are directed or undirected. The default is boost::directedS, which means all lines are directed and can be drawn as arrows. Lines can only be crossed in one direction.
Boost.Graph offers more selectors, including boost::listS, boost::mapS, and boost::hash_setS. boost::bidirectionalS can be used to make lines bidirectional.
5. creating indexes automatically with boost::add_edge()
#include <boost/graph/adjacency_list.hpp>
#include <tuple>
#include <algorithm>
#include <iterator>
#include <iostream> int main() {
typedef boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS> graph;
graph g; enum { topLeft, topRight, bottomRight, bottomLeft }; boost::add_edge(topLeft, topRight, g);
boost::add_edge(topRight, bottomRight, g);
boost::add_edge(bottomRight, bottomLeft, g);
boost::add_edge(bottomLeft, topLeft, g); graph::edge_iterator it, end;
std::tie(it, end) = boost::edges(g);
std::copy(it, end, std::ostream_iterator<graph::edge_descriptor>{std::cout, "\n"}); return ;
}
It is possible to define a graph without calling boost::add_vertex(). Boost.Graph adds missing points to a graph automatically if the points passed to boost::add_edge() don't exist.
Containers
except boost::adjacency_list, there are two other graph containers provided by Boost.Graph: boost::adjacency_matrix, boost::compressed_sparse_row_graph.
1. boost::adjacency_matrix
#include <boost/graph/adjacency_matrix.hpp>
#include <array>
#include <utility> int main() {
enum { topLeft, topRight, bottomRight, bottomLeft }; std::array<std::pair<int, int>, > edges{{
std::make_pair(topLeft, topRight);
std::make_pair(topRight, bottomRight);
std::make_pair(bottomRight, bottomLeft);
std::make_pair(bottomLeft, topLeft);
}}; typedef boost::adjacency_matrix<boost::undirectedS> graph;
graph g{edges.beign(), edges.end(), }; return ;
}
The two template parameters that pass selectors don't exist with boost::adjacency_matrix. With boost::adjacency_matrix, no selectors, such as boost::vecS and boost::setS, are used. boost::adjacency_matrix stores the graph in a matrix, and the internal structure is hardcoded. You can think of the matrix as a two-dimensional table: the table is a square with as many rows and columuns as the graph has points. The internal structure of boost::adjacency_matrix makes it possible to add and remove lines quickly. However, memory consumption is highter. The rule of thumb is to use boost::adjacency_list when there are relatively few lines compared to points. The more lines there are, the more it makes sense to use boost::adjacency_matrix.
2. boost::compressed_sparse_row_graph
#include <boost/graph/adjacency_matrix.hpp>
#include <array>
#include <utility> int main() {
enum { topLeft, topRight, bottomRight, bottomLeft }; std::array<std::pair<int, int>, > edges{{
std::make_pair(topLeft, topRight);
std::make_pair(topRight, bottomRight);
std::make_pair(bottomRight, bottomLeft);
std::make_pair(bottomLeft, topLeft);
}}; typedef boost::compressed_sparse_row_graph<boost::bidirectionalS> graph;
graph g{boost::edges_are_unsorted_multi_pass, edges.beign(), edges.end(), }; return ;
}
boost::compressed_sparse_row_graph can't be changed with. Once the graph has been created, points and lines can't be added or removed. Thus, boost::compressed_sparse_rwo_graph makes only sense when using an immutable graph. only supports directed lines and is low memory consumption.
boost graph的更多相关文章
- 【转】使用Boost Graph library(二)
原文转自:http://shanzhizi.blog.51cto.com/5066308/942972 让我们从一个新的图的开始,定义一些属性,然后加入一些带属性的顶点和边.我们将给出所有的代码,这样 ...
- 【转】使用Boost Graph library(一)
转自:http://shanzhizi.blog.51cto.com/5066308/942970 本文是一篇译文,来自:http://blog.csdn.net/jjqtony/article/de ...
- Boost Graph Library使用学习
Boost Graph Library,BGL 使用学习 探索 Boost Graph Library https://www.ibm.com/developerworks/cn/aix/librar ...
- Boost Graph Library materials
Needed to compute max flow in a project and found the official document of BGL to be rather obscure, ...
- boost库之graph入门
#include <boost/graph/undirected_graph.hpp> #include <boost/graph/adjacency_list.hpp> us ...
- 转债---Pregel: A System for Large-Scale Graph Processing(译)
转载:http://duanple.blog.163.com/blog/static/70971767201281610126277/ 作者:Grzegorz Malewicz, Matthew ...
- 译:Boost Property Maps
传送门:Boost Graph Library 快速入门 原文:Boost Property Map 图的抽象数学性质与它们被用来解决具体问题之间的主要联系就是被附加在图的顶点和边上的属性(prope ...
- Pregel: A System for Large-Scale Graph Processing(译)
[说明:Pregel这篇是发表在2010年的SIGMOD上,Pregel这个名称是为了纪念欧拉,在他提出的格尼斯堡七桥问题中,那些桥所在的河就叫Pregel.最初是为了解决PageRank计算问题,由 ...
- Linux上安装使用boost入门指导
Data Mining Linux上安装使用boost入门指导 获得boost boost分布 只需要头文件的库 使用boost建立一个简单的程序 准备使用boost二进制文件库 把你的程序链接到bo ...
随机推荐
- vue路由vue-router的安装和使用
1.安装,如果你没有在创建项目时候选择的情况下 cnpm install vue-router 2.使用 假设App为根组件,两个自定义组件home及list main.js里操作 impor ...
- css浮动现象及清除浮动的方法
css浮动现象及清除浮动的方法 首先先明确浮动最初的定义及使用场景:实现文本环绕图片的效果. 除了用浮动外,目前暂无其他方法实现文本环绕 再来看看浮动的具体定义: 浮动的框可以左右移动,直至它 ...
- oracle sqldeveloper选择性复制备份数据库
有时需要复制的数据库比较大,复制太慢,或容易出错. 数据库小,简单的 就没这么复杂了,直接导出dmp或用工具都可以.这篇是针对比较大,选择性复制,且复制总是失败的情况. 方法如下. 工具 sqldev ...
- 传统神经网络ANN训练算法总结 参考 。 以后研究
http://blog.163.com/yuyang_tech/blog/static/21605008320146451352506/ 传统神经网络ANN训练算法总结 2014-07-04 17:1 ...
- js面向对象程序设计之属性和对象
写在博客之前的话,这是我这个刚毕业的菜鸟的第一篇博客.一口吃不成一个胖子,我也希望写的第一篇东西就让读的人醍醐灌顶.我会抱着怀疑的态度来看自己写的文章,如果有写错的地方,请大家不要被误导,如果有大神提 ...
- EL表达式(二)运算符
运算符"."和"[]": "."能做的"[]"也能做,"[]"能做的"."不一定 ...
- Learn Python the hard way, ex39 列表的操作
#!/usr/bin/python #coding:utf-8 ten_things = "apples oranges crows telephone light sugar" ...
- MySQL 增删改语句
# DML语言 /* 数据操作语言: 插入:insert 修改:update 删除: delete */ 一.插入语句 insert /* 语法: 方式一: insert into 表名(列名,..) ...
- Convolutional Neural Networks(2):Sparse Interactions, Receptive Field and Parameter Sharing
Sparse Interactions, Receptive Field and Parameter Sharing是整个CNN深度网络的核心部分,我们用本文来具体分析其原理. 首先我们考虑Feedf ...
- Mac010--IDEA安装及应用
Mac--IDEA安装及应用 应用IDEA,首先确保已安装如下环境: JDK:JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库(安装 & 配置环境变 ...