【图论实战】 Boost学习 03:dijkstra_shortest_paths
文章目录
- 示例
- 代码
示例
代码
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/properties.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/graph/named_function_params.hpp>
#include <vector>
#include <string>
using namespace std;
using namespace boost;struct Node{string id_;
};
struct EdgeProperty{int id_;int weight_;EdgeProperty(int id,int weight){id_=id;weight_=weight;}
};
typedef boost::adjacency_list < boost::listS, boost::vecS, boost::undirectedS, Node, boost::property <boost::edge_weight_t, unsigned long>> graph_t;
typedef boost::graph_traits <graph_t>::vertex_descriptor vertex_descriptor;
typedef boost::graph_traits <graph_t>::edge_descriptor edge_descriptor;
enum {A, B, C, D, E, F,G };
string vtx[]={"A","B","C","D","E","F","G"};/* 获取路径经过结点的信息 */
void GetPath(int fromId,int toId,vector<vertex_descriptor>& vPredecessor,std::string& strPath){vector<int> vecPath;while(fromId!=toId){vecPath.push_back(toId);//因为本例子的特殊性和自己很懒,所以可以直接取值toId = vPredecessor[toId];}vecPath.push_back(toId); vector<int>::reverse_iterator pIter = vecPath.rbegin();strPath="路径:";std::string strOperator="->";string c[20]={};for(;pIter!=vecPath.rend();pIter++){// sprintf(c,"%c",vtx[*pIter]);if(*pIter!=fromId){strPath+=(strOperator+vtx[*pIter]);}else{strPath+=vtx[*pIter];}}
}int main()
{/* modify vertex */graph_t g(7);for(int i=0;i< boost::num_vertices(g); i++){g[i].id_=vtx[i];}/* modify edge and weight */typedef std::pair<int, int> Edge; boost::property_map<graph_t,edge_weight_t>::type weightmap= get(boost::edge_weight_t(), g);Edge edge_array[] = { Edge(A,B), Edge(A,C), Edge(B,C), Edge(B,D),Edge(B,E),Edge(C,D), Edge(D,F), Edge(E,F),Edge(E,G),Edge(F,G)};int weight[]={2,5,4,6,10,2,1,3,5,9}; int num_edges = sizeof(edge_array)/sizeof(edge_array[0]); for (int i = 0; i < num_edges; ++i){auto ed=add_edge(edge_array[i].first, edge_array[i].second, g);boost::put(boost::edge_weight_t(), g, ed.first,weight[i]);}/* 路径计算结果定义*///存储从起始结点到其他结点的路径上经过的最后一个中间结点序号vector<vertex_descriptor> vPredecessor(boost::num_vertices(g));//存储起始结点到其他结点的路径的距离vector<unsigned long> vDistance(boost::num_vertices(g)); /*路径探索起始点定义*/vertex_descriptor s = boost::vertex(0, g); boost::property_map<graph_t, boost::vertex_index_t>::type pmpIndexmap = boost::get(boost::vertex_index, g);boost::dijkstra_shortest_paths(g, // IN: 图s, // IN: 起始点&vPredecessor[0], // OUT:存储从起始结点到其他结点的路径上经过的最后一个中间结点序号&vDistance[0], // UTIL/OUT:存储起始结点到其他结点的路径的距离weightmap, // IN: 权重矩阵pmpIndexmap, // IN:std::less<unsigned long>(), // IN: 对比函数boost::closed_plus<unsigned long>(), // IN: 用来计算路径距离的混合函数std::numeric_limits<unsigned long>::max(), // IN: 距离最大值 0, boost::default_dijkstra_visitor()); // OUT:指定每个点所运行的动作std::string strPath;GetPath(0,6,vPredecessor,strPath);cout<<strPath<<endl;cout<<"路径长度:"<<vDistance[6]<<endl;boost::dynamic_properties dp;dp.property("node_id", get(boost::vertex_index, g));dp.property("label", get(boost::edge_weight, g));ofstream outf("min.gv");write_graphviz_dp(outf, g,dp);return 0;
}
// named parameter version
template <typename Graph, typename P, typename T, typename R>
void dijkstra_shortest_paths(Graph& g,typename graph_traits<Graph>::vertex_descriptor s,const bgl_named_params<P, T, R>& params);// non-named parameter version
template <typename Graph, typename DijkstraVisitor, typename PredecessorMap, typename DistanceMap,typename WeightMap, typename VertexIndexMap, typename CompareFunction, typename CombineFunction, typename DistInf, typename DistZero, typename ColorMap = default>
void dijkstra_shortest_paths(const Graph& g,typename graph_traits<Graph>::vertex_descriptor s, PredecessorMap predecessor, DistanceMap distance, WeightMap weight, VertexIndexMap index_map,CompareFunction compare, CombineFunction combine, DistInf inf, DistZero zero,DijkstraVisitor vis, ColorMap color = default)// version that does not initialize the property maps (except for the default color map)
template <class Graph, class DijkstraVisitor,class PredecessorMap, class DistanceMap,class WeightMap, class IndexMap, class Compare, class Combine,class DistZero, class ColorMap>
void dijkstra_shortest_paths_no_init(const Graph& g,typename graph_traits<Graph>::vertex_descriptor s,PredecessorMap predecessor, DistanceMap distance, WeightMap weight,IndexMap index_map,Compare compare, Combine combine, DistZero zero,DijkstraVisitor vis, ColorMap color = default);
相关文章:
【图论实战】 Boost学习 03:dijkstra_shortest_paths
文章目录 示例代码 示例 最短路径: A -> C -> D -> F -> E -> G 长度 16 代码 #include <iostream> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/dijkstra_shortest_paths.hpp> #include <boost/graph/graphviz.h…...
嵌入式养成计划-52----ARM--开发板介绍--相关硬件基础内容介绍--GPIO讲解
一百三十一、开发板介绍 131.1 核心板介绍 131.2 拓展板 一百三十二、相关硬件基础内容介绍 132.1 PCB PCB( Printed Circuit Board),中文名称为印制电路板,又称印刷线路板, 是重要的电子部件,是电子元器…...
线性代数-Python-04:线性系统+高斯消元的实现
文章目录 1 线性系统2 高斯-jordon消元法的实现2.1 Matrix2.2 Vector2.3 线性系统 3 行最简形式4 线性方程组的结构5 线性方程组-通用高斯消元的实现5.1 global5.2 Vector-引入is_zero5.3 LinearSystem5.4 main 1 线性系统 2 高斯-jordon消元法的实现 2.1 Matrix from .Vecto…...
python能用来做什么
Python是一种流行的编程语言,由Guido van Rossum创建,并于1991年发布。 它用于: Web开发(服务器端); 软件开发,数学计算,系统脚本编写。 Python能做什么? Python可以…...
springboot引入外部jar,package打包报错找不到程序包XXX
springboot引入外包jar包有两种方法: 一、第一种: 点击idea左上角file,然后点击project选择Modules,点击右侧Dependencies,点击右侧加号选择JARs or directories,然后选择要导入的jar包。这种方式,引入ja…...
GDPU 数据结构 天码行空9
实验九 哈夫曼编码 一、【实验目的】 1、理解哈夫曼树的基本概念 2、掌握哈夫曼树的构造及数据结构设计 3、掌握哈夫曼编码问题设计和实现 二、【实验内容】 1、假设用于通信的电文仅由8个字母 {a, b, c, d, e, f, g, h} 构成,它们在电文中出现的概率分别为{ 0.…...
ISP算法——UVNR
ISP算法——UVNR 概念简介 UVNR也就是经过CSC只有在YUV域对UV两个色域进行降噪,在有些方案里也叫CNR(chroma noise reduction)。主要就是在YUV域针对彩燥进行特殊处理的一系列算法。 关于噪声产生的原因在前面关于降噪的文章和视频中已经做…...
双十一“静悄悄”?VR购物拉满沉浸式购物体验
以往每年的双十一,都会因为电商购物狂欢而变得热闹非凡,而各大电商平台也会在这天推出各种促销活动。但是,近几年来,双十一正在变得“静悄悄”。一个原因是消费群体越发理性消费,更加重视商品本身的质量和体验…...
(动手学习深度学习)第13章 计算机视觉---图像增广与微调
13.1 图像增广 总结 数据增广通过变形数据来获取多样性从而使得模型泛化性能更好常见图片增广包裹翻转、切割、变色。 图像增广代码实现...
Linux安装MySQL8.0服务
Linux安装MySQL8.0服务 文章目录 Linux安装MySQL8.0服务一、卸载1.1 查看mariadb1.2 卸载 二、安装2.1 下载2.2 上传2.3 解压2.4 重命名2.5 删除2.6 创建目录2.7 环境变量2.8 修改配置2.9 配置文件2.9 用户与用户组2.10 初始化2.11 其它 三、开启远程连接MySQL 一、卸载 首先第…...
地区 IP 库
地区 & IP 库 yudao-spring-boot-starter-biz-ip (opens new window)业务组件,提供地区 & IP 库的封装。 #1. 地区 AreaUtils (opens new window)是地区工具类,可以查询中国的省、市、区县,也可以查询国外的国家。 它的数据来自 …...
MySQL查询语句练习题,测试基本够用了
1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下: CREATE TA…...
删除word最后一页之后的空白页
最近编辑word比较多,有时最后一页(最后一页内容还有可能是表格)之后,还有一页空白页,单独按下backspace、del都删不掉,很让人着急。 经过查询有几种方法: (1)点击选中空…...
基于站点、模式、遥感多源降水数据融合实践技术应用
降水在水循环中发挥着重要作用,塑造了生态景观和生态系统。目前,有四种主要方式获取降水数据:1)雨量计观测,2)地基雷达遥感,3)卫星遥感,4)模式模拟。基于雨量…...
html与django实现多级数据联动
html与django实现多级数据联动 1、流程 1、进入页面后先获取年级数据 2、选择年级后获取院级数据 3、选择院级后获取层次数据 4、选择层次数据后获取专业数据 2、html代码 <p style"margin-top: 10px;"><label>年级</label><select id"…...
网络安全-黑客技术-小白学习
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…...
.NET关于 跳过SSL中遇到的问题
一、事件的起因: 起因:开发项目过程中,可能会遇到 调用其他系统的接口 以及 代码中历史开发人员留下的IP接口访问等问题,后面该项目由自己负责,其他系统全部迁移到容器里面,只提供域名去访问。 问题:访问已迁移到容器其他系统,那么用IP地址访问肯定无法调用成功,只能用…...
fpga时序相关概念与理解
一、基本概念理解 对于数字系统而言,建立时间(setup time)和保持时间(hold time)是数字电路时序的基础。数字电路系统的稳定性,基本取决于时序是否满足建立时间和保持时间。 建立时间Tsu:触发器…...
安卓常见设计模式12------观察者模式(Kotlin版、Livedata、Flow)
1. W1 是什么,什么是观察者模式? 观察者模式(Observer Pattern)是一种行为型设计模式,用于实现组件间的松耦合通信。主要对象有观察者接口(Observer)和可观察对象(Observable&…...
USB偏好设置-Android13
USB偏好设置 1、USB偏好设置界面和入口2、USB功能设置2.1 USB功能对应模式2.2 点击设置2.3 广播监听刷新 3、日志开关3.1 Evet日志3.2 代码中日志开关3.3 关键日志 4、异常 1、USB偏好设置界面和入口 设置》已连接的设备》USB packages/apps/Settings/src/com/android/setting…...
5步快速上手UK Biobank研究分析平台:生物医学数据分析的完整指南
5步快速上手UK Biobank研究分析平台:生物医学数据分析的完整指南 【免费下载链接】UKB_RAP Access share reviewed code & Jupyter Notebooks for use on the UK Biobank (UKBB) Research Application Platform. Includes resources from DNAnexus webinars, on…...
NVIDIA Profile Inspector深度实战:解锁显卡隐藏性能的完整技术指南
NVIDIA Profile Inspector深度实战:解锁显卡隐藏性能的完整技术指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款能够深度访问NVIDIA驱动内部游戏配置文件…...
如何用Bilibili-Evolved打造终极B站体验:新手完整指南
如何用Bilibili-Evolved打造终极B站体验:新手完整指南 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved Bilibili-Evolved是一款功能强大的哔哩哔哩增强脚本,通过丰富的…...
从PRACH前导码规划到5G NR:聊聊ZC序列那些“坑”与网络优化实战经验
从PRACH前导码规划到5G NR:聊聊ZC序列那些“坑”与网络优化实战经验 在4G/5G网络优化中,PRACH前导码规划就像给小区分配独特的"门牌号"——如果设计不当,用户设备连敲门都找不到正确的入口。我曾亲眼见过某省会城市CBD区域因ZC序列…...
企业统一任务调度平台MoiaControl介绍
1、批量作业调度的现状当前批量作业调度软件普遍面临着一些问题:调度方式原始落后时至今日仍然有一些系统使用人工调度或操作系统的crontab方式调度。在如今追求自动化甚至智能化的时代已显得非常原始和低效,容易出错且难以监控,已成为这类系…...
别再硬套MTL了!聊聊谷歌MMoE如何优雅解决推荐系统里的‘任务打架’问题
多任务学习中的优雅解法:MMoE如何破解推荐系统任务冲突难题 当推荐系统需要同时优化点击率、点赞、完播率等多个指标时,算法工程师们常常陷入两难境地——单任务建模无法利用跨目标信息,而粗暴共享参数又会导致"跷跷板效应"。谷歌2…...
HS2-HF_Patch:如何为Honey Select 2一键安装完整汉化与增强补丁
HS2-HF_Patch:如何为Honey Select 2一键安装完整汉化与增强补丁 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 如果你正在寻找Honey Select 2的完整…...
别再问0.1+0.2为什么不等于0.3了!用Go/Python代码带你手撕IEEE754浮点数精度陷阱
从0.10.2≠0.3出发:用代码解剖IEEE754浮点数的隐秘角落 当你在Python里输入0.1 0.2,期待得到0.3时,解释器却返回0.30000000000000004——这不是你的代码写错了,而是计算机存储数字的底层机制在"作怪"。这种现象在金融计…...
2026年OPPO迎来“大年”:影像、折叠屏、IoT等多领域突破,高端化版图持续扩张
2026年4月21日,OPPO在成都举办新品发布会,发布Find X9s Pro和Find X9 Ultra。这一年OPPO在多个领域取得重大进展,迎来发展“大年”。旗舰影像:定义下一代移动影像移动影像是OPPO长期投入的领域,2026年收获颇丰。Find X…...
ORB-SLAM2跑KITTI数据集,除了看轨迹还能做什么?聊聊视觉里程计的实际评估与调参
ORB-SLAM2在KITTI数据集上的深度实践:从轨迹评估到参数调优 当你第一次看到ORB-SLAM2在KITTI数据集上成功运行并输出轨迹时,那种成就感确实令人振奋。但作为一名真正希望掌握视觉SLAM技术的开发者或研究者,这仅仅是探索旅程的起点。本文将带…...
