原文转自:http://shanzhizi.blog.51cto.com/5066308/942972

让我们从一个新的图的开始,定义一些属性,然后加入一些带属性的顶点和边。我们将给出所有的代码,这样你不需要将我们前面给出的代码片段拼接起来。

// Property types

typedef property<edge_weight_t, int> EdgeWeightProperty;

typedef property<vertex_name_t, std::string,

property<vertex_index2_t, int> > VertexProperties;

// Graph type

typedef adjacency_list<vecS, vecS, undirectedS,

VertexProperties, EdgeWeightProperty> Graph;

// Graph instance

Graph g;

// Property accessors

property_map<Graph, vertex_name_t>::type

city_name = get(vertex_name, g);

property_map<Graph, vertex_index2_t>::type

city_index2 = get(vertex_index2, g);

property_map<Graph, edge_weight_t>::type

edge_distance = get(edge_weight, g);

// Create the vertices

typedef graph_traits<Graph>::vertex_descriptor Vertex;

Vertex u1;

u1 = add_vertex(g);

city_name[u1] = "Los Angeles";

city_index2[u1] = 3;

Vertex u2;

u2 = add_vertex(g);

city_name[u2] = "Bakersfield";

city_index2[u2] = 2;

Vertex u3;

u3 = add_vertex(g);

city_name[u3] = "New York";

city_index2[u3] = 1;

// Create the edges

typedef graph_traits<Graph>::edge_descriptor Edge;

Edge e1;

e1 = (add_edge(u1, u2, g)).first;

edge_distance[e1] = 100;

Edge e2;

e2 = add_edge(u1, u3, g).first;

edge_distance[e2] = 2500;

第一段代码中,我们定义了属性类型,接着定义了图类型,然后我们创建了图的一个实例g。下一步我们要获得对象的属性来存取对象,如同我们前面所说的。

我们开始增加顶点和边。为了简化代码,从vertex_descriptor创建了一个自己的类型Vertex,接着我们传递g给协助函数add_vertex,从而为g增加一个顶点。

注意

请记住,图中的顶点是没有位置的,所以我们不需要告诉图我们想要增加顶点的位置,我们只需增加顶点即可。

图增加一个顶点后返回该顶点的顶点描述,这样我们可以利用属性存取对象设置该顶点相应的属性:city_name 和city_index2。设置属性是容易的,我们只要将顶点象个索引似的放在[]中。

创建边也是类似的,除了add_edge函数返回的是pair类型,而不是边类型。所以我们给该函数的返回值加上.first得到需要的边类型。我们将结果(边类型)保存在一个变量中,接着我们使用该变量来设置属性。由于在数学上边无非就是两个顶点组成的集合,所以我们需要将它们(两个顶点)和图本身传递给函数add_edge。

遍历顶点和边

为了遍历边和顶点,你需要调用edges或vertices来获得相应的迭代子。这些函数的返回值类型是pair,你可以在你的遍历中使用它们。下面的两小块代码展示了如何遍历边和顶点。

// Iterate through the vertices and print them out

typedef graph_traits<Graph>::vertex_iterator vertex_iter;

std::pair<vertex_iter, vertex_iter> vp;

for (vp = vertices(g); vp.first != vp.second; ++vp.first)

std::cout << city_name[*vp.first] << " " << city_index2[*vp.first] << std::endl;

std::cout << std::endl;

// Iterate through the edges and print them out

Vertex v1, v2;

typedef graph_traits<Graph>::edge_iterator edge_iter;

std::pair<edge_iter, edge_iter> ep;

edge_iter ei, ei_end;

for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)

std::cout << edge_distance[*ei] << endl;

上面的这两小块代码使用了两种不同的方法来演示edges和vertices函数的返回值类型pair的使用。当遍历顶点时,返回的是一个pair(我们为这个pair创建了一个typedef);为了访问顶点,我们使用vp.first,这是一个迭代子;象绝大多数C++中的迭代子一样,可以通过解引用(dereference)的方式来获得它指向的对象。这样我们可以写出城市名称和序号:

city_name[*vp.first]

city_index2[*vp.first]

如果你不想使用pair,标准库中有一个方便的协助函数tie,它可以将pair中的各个部分赋给tie函数中的实参。比如,edges函数返回一个pair,调用:

tie(ei, ei_end) = edges(g)

将保存pair的第一项给ei,第二项给ei_end。这样,在循环中,你可以简单地使用*ei来存取边,就像:

edge_distance[*ei]

使用图和boos解决问题

虽然游戏Six Degrees of Kevin Bacon很好玩,但事实上游戏中的问题就是最短路径问题,该问题有一些具体的应用,而超出了电影明星所考虑的问题。比方说,你叫一个货运公司帮你从Bakersfield , California到Lake Mary, Florida运送货物,运送方需要找到一条从出发地到目的地的最短路径。通常,这个包裹需要经过几个城市,每个城市就可以看作的一个顶点,并且城市之间是用边连接起来的。这个图是带权重的,这是因为城市之间的距离是在变化的。在这一点上,这个问题有别于Six Degrees问题的。

数学家和计算机学家研究出了许许多多算法来求解图论问题,这其中就包括了最短路径问题,许多书全文讨论如何使用图论方法来解决问题。当然,许多大问题都涉及大量的顶点和边,这样的问题最适合让计算机来计算了。

Boost库包含许多著名的算法,这样你就不需要自己编写代码实现这些算法了。比如它就包含了几种不同的最短路径算法。事实上,Kevin Bacon问题并不是图论真正关心的问题,因为它所有边的权重都是1,这意味着当两个演员出现在一本电影中,他们就连接起来了,而这连接并没有所谓的物理距离。

当所有的边的权重都是1时,算法就等价于广度优先算法(BFS),BFS是用于从根节点(顶点)出发遍历所有的顶点。其思想是从根顶点出发,访问与根顶点相连的顶点,并标记这些顶点为已经访问过的。接着你再用同样的方法继续访问还没访问过的顶点,直到所有的顶点都被访问,或者在你找到你想要的顶点上停止遍历,这也意味着你找到了你所要顶点的最短路径。

提示 

请考虑:当你找到你所要寻找的顶点,你如何可以认为你找到了最短路径呢?这是因为,假如有比你现在找到的更短的路径,它应当在此之前就已经被找到了。这个理由听起来很平凡,但从数学上,你已经能过看到算法是如何找到最短路径的。

Boost库的文档包含了Kevin Bacon游戏的很好的示例,在这里就不重复这些类似的代码了,我们建议去查看这个文档。

对大多数程序员来说,比Kevin Bacon游戏更感兴趣的是文件依赖问题。象make和ant程序都需要这个算法,比方说,你在写一个电子表格软件,表中有许多单元格,它们包含了对其他单元格引用的公式;需要你给出这些公式的计算顺序。如果单元格A1的公式使用了单元格A2,并且A2也包含了一个公式,你就必须在计算A1之前先计算A2中的公式;这就是依赖问题。同样的道理也出现在编译程序(如make和ant)中,如果file1依赖于file2,就需要在编译file1之前编译file2。Boost Graph库的文档中有一个求解文件依赖问题的示例。

转载于:https://www.cnblogs.com/mlv5/p/3754462.html

【转】使用Boost Graph library(二)相关推荐

  1. Boost Graph Library 快速入门

    Boost Graph Library 快速入门 图领域的数据结构和算法在某些方面比容器更为复杂,图算法在图中移动有着众多的路线,而STL使用的抽象迭代器接口不能有效的支持这些.作为替换,我们为图提供 ...

  2. C++图常用库boost graph library

    接下来一段日子,会写一些跟bgl相关的内容.bgl是一个性能很不错的库,但是源码跟鬼畜一样-文档也写得很乱.因为最近做的论文需要比较好的性能,实在不得不硬着头皮重新用起bgl.所以尽可能的做一些总结, ...

  3. Boost 学习之二 BGL

    Boost 学习之二 BGL --by  wangsh Boost.Graph(也称为BGL, Boost Graph Library),BGL库浓缩了网络和图的经典算法. 使用BGL库不用编译整个库 ...

  4. boost graph_探索Boost Graph库

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

  5. Boost Graph Library-BGL学习笔记1

    首先需要说明的是BGL是一个增强STL map的通用类库,这个库是一个仅有header文件的C++库,不需要分开编译.我发现很多文章上来就讲怎么用,其实安装和导入可能会让一些人卡一会儿,做法也比较简单 ...

  6. 了解 Boost Filesystem Library文件系统

    C++ 语言(实际上是 C++ 标准)的最常见问题之一是,缺乏定义良好的库来帮助处理文件系统查询和操作.由于这个原因,程序员不得不使用本机操作系统提供的应用程序编程接口(Application Pro ...

  7. boost::graph::distributed::mpi_process_groupboost::graph::用法的测试程序

    boost::graph::distributed::mpi_process_groupboost::graph::用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::di ...

  8. boost::graph::distributed::hohberg_biconnected_components用法的测试程序

    boost::graph::distributed::hohberg_biconnected_components用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::dis ...

  9. boost::graph::distributed::distributed_queue用法的测试程序

    boost::graph::distributed::distributed_queue用法的测试程序 实现功能 C++实现代码 实现功能 boost::graph::distributed::dis ...

最新文章

  1. 解决:angularjs radio默认选中失效问题
  2. 宝塔服务器环境好不好_服务器环境怎么搭建?(宝塔环境搭建教程)
  3. Intel汇编程序设计-高级过程(上)
  4. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。
  5. AWS 日本出现大规模故障
  6. 特斯拉提升安全监控等级,推出“哨兵模式”
  7. 反向 Dropout,韩松团队最新工作NetAug:提高Tiny神经网络性能的新训练方法
  8. ios 图片添加阴影
  9. 4005基于邻接表的顶点的删除(C++,附思路)
  10. windows 2008 终端服务器配置,windows 2008终端服务器设置
  11. (转)Spring中的事务操作
  12. mips指令分类和寻址大全
  13. 如何在 iPhone、iPad 和 Mac 上通过 iMessage 共享照片和视频?
  14. 数据结构-买卖青蛙最大利润
  15. win7系统安装网银助手时提示您尚未正确安装错误的两种解决方法图文教程
  16. JSONObject 转对象
  17. Android 自定义键盘 随机键盘
  18. h5+app Android上架华为应用市场被拒原因“拒绝获取手机权限后app会闪退“以及隐私政策问题
  19. 如何查看软件是32位还是64位
  20. 科技交流英语(2022秋)Unit1-Unit8题干速查

热门文章

  1. 台风怎么看内存颗粒_【无趣】使用300多元的D4 16G内存是种什么体验
  2. 响应式html5框架,15个最好的HTML5前端响应式框架(2014)
  3. java 读取txt乱码_java 逐行读取txt文本如何解决中文乱码
  4. Java基础篇:如何解决成员的访问和继承?
  5. WebSocket 协议 RFC 文档(全中文翻译)
  6. [转] webpack之plugin内部运行机制
  7. python函数名的应用、闭包和迭代器
  8. python学习之老男孩python全栈第九期_day024知识点总结——单继承、多继承
  9. git的一些简单使用
  10. IJCAI最佳论文公布 华人斩获最佳学生论文奖!