【图论实战】 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.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);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

状态机实现RGB灯跳变

1.项目功能梗概 因为原本使用的为for循环进行遍历&#xff0c;然后依次执行代码&#xff0c;但是由于看门狗的存在&#xff0c;不能使用delay_ms这种死延时。所以现在打算定时器回调函数控制状态机状态这种方法。 2.状态机 作用 当系统需要执行某个任务时&#xff0c;可以根据…

力扣字符串--总结篇

前言 字符串学了三天&#xff0c;七道题。初窥kmp&#xff0c;已经感受到算法的博大精深了。 内容 对字符串的操作可以归结为以下几类&#xff1a; 字符串的比较、连接操作&#xff08;不同编程语言实现方式有所不同&#xff09;&#xff1b; 涉及子串的操作&#xff0c;比…

Python数据结构: 列表(List)详解

在Python中&#xff0c;列表&#xff08;List&#xff09;是一种有序、可变的数据类型&#xff0c;被广泛用于存储和处理多个元素。列表是一种容器&#xff0c;可以包含任意数据类型的元素&#xff0c;包括数字、字符串、列表、字典等。本文将深入讨论列表的各个方面&#xff0…

strcat()用法

描述 头文件&#xff1a;<string.h>char *strcat&#xff08;char *dest&#xff0c; const char *src&#xff09;功能&#xff1a;将src字符串加到dest上&#xff0c;并返回指向dest字符串的指针。 举例 #include<stdio.h> #include<string.h> int mai…

基恩士软件的基本操作(一)

今天就来学习基恩士软件的基础操作&#xff0c;欢迎大家的指正&#xff01;&#xff01;&#xff01; 基本操作 KV STUDIO 基恩士编程软件的名称就KV STUDIO。安装软件地址KV STUDIO的安装与实践 项目的创建 1&#xff0c;双击KV STUDIO. 2&#xff0c;新建项目 单元编辑器…

【MATLAB源码-第74期】基于matlab的OFDM-IM索引调制系统不同频偏误码率对比,对比OFDM系统。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术&#xff0c;它将正交频分复用&#xff08;OFDM&#xff09;和索引调制&#xff08;IM&#xff09;相结合&#xff0c;以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

【docker:容器提交成镜像】

容器创建部分请看&#xff1a;点击此处查看我的另一篇文章 容器提交为镜像 docker commit -a "sinwa lee" -m "首页变化" mynginx lxhnginx:1.0docker run -d -p 88:80 --name lxhnginx lxhnginx:1.0为啥没有变啊&#xff0c;首页&#xff1f; 镜像打包 …

SMART PLC模拟量上下限报警功能块(梯形图代码)

博途PLC模拟量偏差报警功能块请参考下面的文章链接: 模拟量偏差报警功能块(SCL代码)_RXXW_Dor的博客-CSDN博客文章浏览阅读594次。工业模拟量采集的相关基础知识,可以查看专栏的系列文章,这里不再赘述,常用链接如下:PLC模拟量采集算法数学基础(线性传感器)_plc傳感器數…

ElasticSearch7.x - HTTP 操作 - 文档操作

创建文档(添加数据) 索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数 据库中的表数据,添加的数据格式为 JSON 格式 向 ES 服务器发 POST 请求 :http://192.168.254.101:9200/shopping/_doc 请求体内容为: {"title":"小…

多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测

多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测 目录 多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时…

Dell戴尔灵越Inspiron 7700 AIO一体机电脑原厂预装Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1-slgR9t4Df_eko0Y6xaeyw?pwdmk0p 提取码&#xff1a;mk0p 灵越7700一体机原装出厂系统自带声卡驱动、无线网卡驱动、面部识别等所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 由于时间关系,…

软件测试项目实战经验附视频以及源码【商城项目,app项目,电商项目,银行项目,医药项目,金融项目】(web+app+h5+小程序)

前言&#xff1a; ​​大家好&#xff0c;我是阿里测试君。 最近很多小伙伴都在面试&#xff0c;但是对于自己的项目经验比较缺少。阿里测试君再度出马&#xff0c;给大家找了一个非常适合练手的软件测试项目&#xff0c;此项目涵盖web端、app端、h5端、小程序端&#xff0c;…

【Linux奇遇记】我和Linux的初次相遇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:Linux奇遇记系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 前端和后端的介绍 1.前端 2.后端 3.前后端区别 Linux在前后端开发中的角色 如何学习Linux 去进行程序开发 Linux的常见根目…

[工业自动化-10]:西门子S7-15xxx编程 - PLC主站 - 信号量:数字量

目录 前言&#xff1a; 一、工业现场常见信号的分类 二、IO数字量模块 2.1 概述 2.2 PLC的数字量是24V还是5V电压&#xff1f; 2.2 数字量模块的安装与接线 2.3 数字量模的注意事项 前言&#xff1a; 一、工业现场常见信号的分类 在工业自动化领域&#xff0c;常常需要使…

【word技巧】word文件中的图片,批量提取

如果你需要word文件中的图片做其他事情&#xff0c;除了一张张的进行图片另存为以外&#xff0c;我们还有其他方法可以批量一次性保存word文档中的图片嘛&#xff1f;今天分享两个方法&#xff0c;批量保存word文档图片。 方法一&#xff1a; 将文件进行另存为&#xff0c;在…

OpenWRT配置SFTP远程文件传输,让数据分享更安全

文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我们将在OpenWRT上安装SFTP服务&#xff0c;并结合cpolar内网穿透&#xff0c;创建安全隧道映射22端口&#xff0c;实现在公网环境下远程OpenWRT SFTP&#xf…

vue项目pdf文件的预览

1.下载 您可以在以下网址下载pdfjsLib&#xff1a;https://github.com/mozilla/pdf.js pdfjsLib是一个开源项目&#xff0c;您可以在GitHub上找到其源代码和相关资源。 2.放置文件位置 3.进入 在index.html引入 <script src"<% BASE_URL %>static/pdfjs-dist/b…

Linux - 基础IO(Linux 当中的文件,文件系统调用接口,文件描述符)- 上篇

前言 首先&#xff0c;关于文件我们最先要理解的是&#xff0c;文件不仅仅存储的是数据&#xff0c;一个文件包括 内容 数据。内容好理解&#xff0c;就是我们先要这文件存储哪一些数据&#xff0c;这些数据就是文件的内容。 但是&#xff0c;在计算机当中&#xff0c;有两种…

Windows 10 下使用Visual Studio 2017 编译CEF SDK

1.下载CEF SDK 由于需要跑在32位的机器&#xff0c;所以选择下载32位的SDKCEF Automated Builds 选择 Current Stable Build (Preferred) &#xff0c;这是当前稳定版本&#xff0c;CEF版本118 下载成功解压 2.下载编译工具 CMake 下载地址&#xff1a;CMake 配置CMake指向…

n-gram语言模型——句子概率分布计算与平滑

n-gram语言模型——句子概率分布计算与平滑 前言 语言模型 等价假设 n元语法 句子概率分布计算方式 数据平滑 Lidstone平滑(1-gram) Laplace平滑(1-gram) 附上两种平滑在1-gram下代码 Lidstone平滑与Laplace平滑(2-gram) 附上两种平滑在2-gram下代码 前言 语言模型…
最新文章