boost graph之基础

结构

在这里插入图片描述

属性相关

put_get_helper<Reference, LvaluePropertyMap>
iterator_property_map<RandomAccessIterator, IndexMap, T, R>
safe_iterator_property_map<RandomAccessIterator, IndexMap, T, R>
associative_property_map<UniquePairAssociativeContainer>
const_associative_property_map<UniquePairAssociativeContainer>
static_property_map<ValueType>
ref_property_map<KeyType, ValueType>
typed_identity_property_map<T>

图获取属性

//boost/graph/detail/adjacency_list.hpp
template <class Config, class Base, class Property>inlinetypename boost::property_map<typename Config::graph_type, Property>::typeget(Property p, adj_list_helper<Config, Base>& g) {typedef typename detail::property_kind_from_graph<adj_list_helper<Config, Base>, Property>::type Kind;return detail::get_dispatch(g, p, Kind());}template <class Config, class Base, class Property>inlinetypename boost::property_map<typename Config::graph_type,Property>::typeget_dispatch(adj_list_helper<Config,Base>&, Property p,boost::edge_property_tag) {typedef typename Config::graph_type Graph;typedef typename boost::property_map<Graph, Property>::type PA;return PA(p);}

通过get_dispatch作转发,调用具体的模板特例化实例
graph对于图这块专门定义了类property_map,用来表示图属性相关的,分为点属性edge_property_map和边属性vertex_property_map

template <class Graph, class Property, class Enable = void>struct property_map:mpl::if_<is_same<typename detail::property_kind_from_graph<Graph, Property>::type, edge_property_tag>,detail::edge_property_map<Graph, Property>,detail::vertex_property_map<Graph, Property> >::type{};

边属性

其依赖边属性选择器edge_property_selector,对于不同的图会特例化不同的边选择器

template <class Graph, class PropertyTag>struct edge_property_map: edge_property_selector<typename graph_tag_or_void<Graph>::type>::type::template bind_<Graph,typename edge_property_type<Graph>::type,PropertyTag>{};template <class GraphTag>struct edge_property_selector {typedef detail::dummy_edge_property_selector type;};

对于邻接表,特例化为

template <>struct edge_property_selector<adj_list_tag> {typedef detail::adj_list_edge_property_selector type;};template <>struct edge_property_selector<vec_adj_list_tag> {typedef detail::adj_list_edge_property_selector type;};

对于边列表,特例化为

template <>struct edge_property_selector<edge_list_tag> {typedef edge_list_edge_property_selector type;};template <>struct edge_property_selector<edge_list_ra_tag> {typedef edge_list_ra_edge_property_selector type;};

对于图作为树,特例化为

template <>struct edge_property_selector<graph_as_tree_tag> {typedef detail::graph_as_tree_edge_property_selector type;};

标签图,特例化为

template <>
struct edge_property_selector<labeled_graph_class_tag> {typedef graph_detail::labeled_graph_edge_property_selector type;
};

子图,特例化为

template <>
struct edge_property_selector<subgraph_tag> {typedef detail::subgraph_property_generator type;
};

点属性

其依赖点属性选择器vertex_property_selector,对于不同的图会特例化不同的点选择器

template <class Graph, class PropertyTag>struct vertex_property_map: vertex_property_selector<typename graph_tag_or_void<Graph>::type>::type::template bind_<Graph,typename vertex_property_type<Graph>::type,PropertyTag>{};template <class GraphTag>struct vertex_property_selector {typedef detail::dummy_vertex_property_selector type;};

对于邻接表,特例化为

template <>struct vertex_property_selector<adj_list_tag> {typedef adj_list_vertex_property_selector type;};struct vec_adj_list_vertex_property_selector {template <class Graph, class Property, class Tag>struct bind_: detail::vec_adj_list_choose_vertex_pa<Tag,Graph,Property> {};};template <>struct vertex_property_selector<vec_adj_list_tag> {typedef vec_adj_list_vertex_property_selector type;};

对于图作为树,特例化为

template <>struct vertex_property_selector<graph_as_tree_tag> {typedef detail::graph_as_tree_vertex_property_selector type;};

标签图,特例化为

template <>
struct vertex_property_selector<labeled_graph_class_tag> {typedef graph_detail::labeled_graph_vertex_property_selector type;
};

子图,特例化

template <>
struct vertex_property_selector<subgraph_tag> {typedef detail::subgraph_property_generator type;
};

邻接表

adjacency_list
adj_list_gen
config
vec_adj_list_impl
adj_list_impl
adj_list_helper
directed_edges_helper
directed_graph_helper
undirected_graph_helper
bidirectional_graph_helper
bidirectional_graph_helper_with_property

adj_list_gen中定义了config类,以及vec_adj_list_impl,adj_list_impl,其中vec_adj_list_impl和adj_list_impl是if条件类型来区分
同时也定义了DirectedHelper,这个是通过mpl::if_的条件选型来决定是基类是使用bidirectional_graph_helper_with_property,还是directed_graph_helper或者undirected_graph_helper

list_edge
edge_base

edge_base:只包含顶点,没有其它的信息
list_edge:除了包含顶点信息,还包含边的辅助信息

边描述符

邻接表的边通过adjacency_list_traits定义

edge_desc_impl
edge_base

邻接表的点adjacency_list_traits中定义,如果支持随机访问时,类型为size_t,否则类型为void*

容器生成器

container_gen模板两个类型参数Selector和ValueType
Selector:表示所使用的容器类型,支持
● list
● vector
● map
● set
● multiset
● multimap
● hash_set
● hash_map
● hash_multiset
● hash_multimap
ValueType:表示容器中元素的类型
点的关连边表示所使用的就是container_gen,其值类型为StoredEdge,可能的值为
● stored_edge_property
● stored_ra_edge_iter
● stored_edge_iter

stored_edge
stored_edge_property
stored_edge_iter
stored_ra_edge_iter

点表示类型可以为
● stored_vertex
● vertex_ptr(void*)

stored_vertex
bidir_rand_stored_vertex
rand_stored_vertex
bidir_seq_stored_vertex
seq_stored_vertex

算法

基础

BFS

使用visitor模式,bfs visitor的必须支持以下方法
● initialize_vertex:算法开始时初始化点相关处理
● discover_vertex:发现点时处理
● examine_vertex:检查点处理
● examine_edge:检查边处理
● tree_edge:树边处理
● non_tree_edge:非树边处理
● gray_target:反向边处理
● black_target:前身边或者交叉边处理
● finish_vertex:点遍历完全时处理
bfs_visitor是bfs中其它visitor的代理,其模板类型参数表示代理的visitor类型

bfs_visitor<Visitors>
base_visitor<Visitor>
+operator()(T, Graph&)
null_visitor
dijkstra_visitor<Visitors>
+void edge_relaxed(Edge e, Graph& g)
+void edge_not_relaxed(Edge e, Graph& g)
astar_visitor
brandes_dijkstra_visitor
visitor_type
graph_copy_visitor
core_numbers_visitor
SAW_visitor
parallel_dijkstra_bfs_visitor
scc_discovery_visitor

DFS

dfs visitor的必须支持以下方法
● initialize_vertex
● start_vertex
● discover_vertex
● examine_edge
● tree_edge
● back_edge
● forward_or_cross_edge
● finish_vertex
● finish_edge

dfs_visitor<Visitors>
base_visitor<Visitor>
+operator()(T, Graph&)
null_visitor
topo_sort_visitor
biconnected_components_visitor
components_recorder
odd_components_counter
tarjan_scc_visitor
SAW_visitor
planar_dfs_visitor

最短路径

dijkstra_shortest_paths对于bgl_named_params会调用分发函数dijkstra_dispatch1

dijkstra_shortest_paths(const VertexListGraph& g,typename graph_traits<VertexListGraph>::vertex_descriptor s,const bgl_named_params<Param,Tag,Rest>& params)
-> 
dijkstra_dispatch1(const VertexListGraph& g,typename graph_traits<VertexListGraph>::vertex_descriptor s,DistanceMap distance, WeightMap weight, IndexMap index_map,const Params& params)
->
dijkstra_dispatch2(const VertexListGraph& g,typename graph_traits<VertexListGraph>::vertex_descriptor s,DistanceMap distance, WeightMap weight, IndexMap index_map,const Params& params)
->
dijkstra_shortest_paths(const VertexListGraph& g,typename graph_traits<VertexListGraph>::vertex_descriptor s,PredecessorMap predecessor, DistanceMap distance, WeightMap weight,IndexMap index_map,Compare compare, Combine combine, DistInf inf, DistZero zero,DijkstraVisitor vis,const bgl_named_params<T, Tag, Base>&BOOST_GRAPH_ENABLE_IF_MODELS_PARM(VertexListGraph,vertex_list_graph_tag))
-> 
voiddijkstra_shortest_paths(const VertexListGraph& g,SourceInputIter s_begin, SourceInputIter s_end,PredecessorMap predecessor, DistanceMap distance, WeightMap weight,IndexMap index_map,Compare compare, Combine combine, DistInf inf, DistZero zero,DijkstraVisitor vis)
-> 
voiddijkstra_shortest_paths(const VertexListGraph& g,SourceInputIter s_begin, SourceInputIter s_end,PredecessorMap predecessor, DistanceMap distance, WeightMap weight,IndexMap index_map,Compare compare, Combine combine, DistInf inf, DistZero zero,DijkstraVisitor vis,const bgl_named_params<T, Tag, Base>&BOOST_GRAPH_ENABLE_IF_MODELS_PARM(VertexListGraph,vertex_list_graph_tag))
->
voiddijkstra_shortest_paths(const VertexListGraph& g,SourceInputIter s_begin, SourceInputIter s_end,PredecessorMap predecessor, DistanceMap distance, WeightMap weight,IndexMap index_map,Compare compare, Combine combine, DistInf inf, DistZero zero,DijkstraVisitor vis, ColorMap color)

dijkstra_visitor在bfs_visitor基础上新增了两个方法

  • edge_relaxed
  • edge_not_relaxed
template <class Edge, class Graph>void edge_relaxed(Edge e, Graph& g) {invoke_visitors(this->m_vis, e, g, on_edge_relaxed());}template <class Edge, class Graph>void edge_not_relaxed(Edge e, Graph& g) {invoke_visitors(this->m_vis, e, g, on_edge_not_relaxed());}

最后的dijkstra_shortest_paths方法主要做下面一些事

  • 初始化顶点,将所有点的距离设置为inf,前驱结点设置为自身,点的颜色设置为白色,表示没有访问,源点的距离设置为0
for (boost::tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {vis.initialize_vertex(*ui, g);put(distance, *ui, inf);put(predecessor, *ui, *ui);put(color, *ui, Color::white());}for (SourceInputIter it = s_begin; it != s_end; ++it) {put(distance, *it, zero);}
  • 调用dijkstra_shortest_paths_no_init
dijkstra_shortest_paths_no_init(const Graph& g,SourceInputIter s_begin, SourceInputIter s_end,PredecessorMap predecessor, DistanceMap distance, WeightMap weight,IndexMap index_map,Compare compare, Combine combine, DistZero zero,DijkstraVisitor vis, ColorMap color)

使用dijkstra_bfs_visitor的Visitor,调用breadth_first_visit

dijkstra_bfs_visitor的visitor的模板参数使用的是dijkstra_visitor<null_visitor>,实际是没有做任何处理,关键处理逻辑是放在
dijkstra_bfs_visitor中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软自带浏览器Edge,无法关闭“保存历史记录网站的屏幕截图”解决方案

微软自带浏览器Edge&#xff0c;无法关闭“保存历史记录网站的屏幕截图”解决方案 吐槽1&#xff1a;Windows自带的Chrome内核版本的浏览器Microsofg Edge刚发布时可谓一股清流&#xff0c;启动速度快&#xff0c;占用内存较小&#xff0c;相信很多人也开始抛弃正代Chrome&…

【Spring】08 BeanNameAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点&#xff0c;其中之一就是 Bean 生命周期中的回调接口。本文将聚焦于其中的一个接口 BeanNameAware&#xff0c;介绍它的作…

Hudi 在 vivo 湖仓一体的落地实践

作者&#xff1a;vivo 互联网大数据团队 - Xu Yu 在增效降本的大背景下&#xff0c;vivo大数据基础团队引入Hudi组件为公司业务部门湖仓加速的场景进行赋能。主要应用在流批同源、实时链路优化及宽表拼接等业务场景。 一、Hudi 基础能力及相关概念介绍 1.1 流批同源能力 与H…

go学习redis的学习与使用

文章目录 一、redis的学习与使用1.Redis的基本介绍2.Redis的安装下载安装包即可3.Redis的基本使用1&#xff09;Redis的启动&#xff1a;2&#xff09;Redis的操作的三种方式3&#xff09;说明&#xff1a;Redis安装好后&#xff0c;默认有16个数据库&#xff0c;初始默认使用0…

java导出word使用模版与自定义联合出击解决复杂表格!

1. 看一下需要导出什么样子的表格 如图所示&#xff0c;这里的所有数据行都是动态的&#xff0c;需要根据查询出来的数据循环展示。 如果只是这样的话&#xff0c;使用freemarker应该都可以搞定&#xff0c;但是他一列中内容相同的单元格&#xff0c;需要合并。 这对于表格样式…

conda命令克隆(复制)环境

前情介绍 最近有个需求是&#xff1a;根据已有的环境生成一个新的环境&#xff0c;也就是所需的新环境有大多数包和已有的环境都是相同的&#xff0c;需要改的只是部分&#xff0c;所以呢&#xff0c;克隆一个就再适合不过了&#xff01; 所需命令 conda create -n B --clone…

java设计模式-工厂方法模式

1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口&#xff0c;将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 2.工厂方法模式的主要优缺点 优点&#xff1a; 用户只需要知道具体工厂的名称…

HPM6750系列--第九篇 GPIO详解(基本操作)

一、目的 在之前的博文中我们主要介绍了不同系统不同开发编译调试环境的配置和操作&#xff08;命令行方式、Visual Studio Code、Segger Embedded Studio for RISC-V&#xff09;&#xff0c;以帮助大家准备好学习环境为目的&#xff0c;但是未涉及到芯片本身以及外设的讲解。…

【linux】图形界面Debian的root用户登陆

图形界面Debian默认不允许以root用户登录。这是出于安全考虑&#xff0c;以防止用户使用root权限执行可能损害系统的操作。 如果需要使用root用户&#xff0c;可以通过以下步骤进行登录&#xff1a; 打开终端&#xff0c;使用su命令切换到root用户。修改/etc/gdm3/daemon.con…

大型网站架构演进过程

架构演进 大型网站的技术挑战主要来自于庞大的用户&#xff0c;高并发的访问和海量的数据&#xff0c;任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户&#xff0c;问题就会变得很棘手。大型网站架构主要就是解决这类问题。 架构选型是根据当前业务需要来的&…

时序预测 | Python实现XGBoost电力需求预测

时序预测 | Python实现XGBoost电力需求预测 目录 时序预测 | Python实现XGBoost电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行业预测进行比较…

JS中的String常用的实例方法

splice():分隔符 把字符串以分隔符的形式拆分为数组 const str pink,red;const arr str.split(,);console.log(arr);//Array[0,"pink";1:"red"]const str1 2022-4-8;const arr1 str1.split(-);console.log(arr1);//Array[0,"2022";1:"…

Vue3快速上手笔记

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/release…

实操Nginx(七层代理)+Tomcat多实例部署,实现负载均衡和动静分离

目录 Tomcat多实例部署&#xff08;192.168.17.27&#xff09; 1.安装jdk&#xff0c;设置jdk的环境变量 2.安装tomcat在一台已经部署了tomcat的机器上复制tomcat的配置文件取名tomcat1 ​编辑 编辑配置文件更改端口号&#xff0c;将端口号改为8081 启动 tomcat&#xff…

SpringBoot之响应的详细解析

2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有请求就有响应&#xff09; 那么Controller程序呢&#xff0c;除了接收请求外&#xff0c;还可以进行响应。 2.1 ResponseBody 在我们前面所编写的controller方法中&#xff0c;都已经设置了…

Linux面试题精选:提升你的面试准备

大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

CD8+T细胞通过NKG2D-NKG2DL轴维持对MHC-I阴性肿瘤细胞的杀伤

今天给同学们分享一篇实验文章“CD8 T cells maintain killing of MHC-I-negative tumor cells through the NKG2D-NKG2DL axis”&#xff0c;这篇文章发表在Nat Cancer期刊上&#xff0c;影响因子为22.7。 结果解读&#xff1a; MHC-I阴性肿瘤的免疫疗法需要CD8 T细胞 作者先…

下午好~ 我的论文【yolo1~4】(第二期)

写在前面&#xff1a;本来是一期的&#xff0c;我看了太多内容了&#xff0c;于是分成三期发吧 TAT &#xff08;捂脸&#xff09; 文章目录 YOLO系列v1v2v3v4 YOLO系列 v1 You Only Look Once: Unified, Real-Time Object Detection 2015 ieee computer society 12.3 CCF-C…

高云GW1NSR-4C开发板M3核串口通信

1.PLLVR频率计算 高云的M3核要用到PLLVR核&#xff0c;其输出频率FCLKIN*(FBDIV_SEL1)/(IDIV_SEL1)&#xff0c;但同时要满足FCLKIN*(FBDIV_SEL1)*ODIV_SEL)/(IDIV_SEL1)的值在600MHz和1200MHz之间。例如官方示例&#xff0c;其输入频率FCLKIN50MHz&#xff0c;要输出80MHz&am…