多段图的最短路径问题-----动态规划法

2023-05-16

对多段图,求最短路径,如图:

对其使用动态规划法:

阶段:将图中的顶点划分5个阶段,k

状态:每个阶段有几种供选择的点s

决策:当前状态应在前一个状态的基础上获得。决策需要满足规划方程

规划方程:f(k)表示状态k到终点状态的最短距离。

初始条件:f(k)=0;

方程:f(k-1)=min{f(k)+W(k-1,k)}其中W(k-1,k)表示状态k-1到状态k的距离

代码如下:

#include<limits.h>
#include<iostream>
using namespace std;
void Init_Graph(int N,int k,int** S, int **C)
{
	int X;
	int i,j;
	int temp=N;
	cout<<"输入边的长度:输入1 2 4 表示点1 与 2的边的长度为 4:首数字为0表示结束输入"<<endl;
	cin>>i;
	while (i!=0)
	{
		cin>>j;
		cin>>C[i][j];
		cin>>i;
	}
	cout<<"输入每个阶段有哪些点:输入:X 1 2 3表示该阶段有X个点,分别为1,2,3:"<<endl;
	for (i=1;i<=k;i++)
	{
		cout<<"输入第"<<i<<"阶段的状态的点数:";
		cin>>X;
		cout<<"这些点分别为:";
		for (j=0;j<X;j++)
		{
			cin>>S[i][j];
		}
	}
}
void Plan(int N,int k,int **S,int **F,int** C,int *result)
{
	int i,j,t=N;
	int m;
	int point;
	//cout<<S[k][0]<<" ";
	point=S[k][0];
	for (i=k-1;i>=1;i--)//阶段
	{
		j=0;//i阶段的状态
		while (S[i][j]!=0)//状态
		{
			m=0;//i+1阶段的状态
			F[i][j]=INT_MAX;
			if (C[S[i][j]][point]==INT_MAX)
			{
				while (S[i+1][m]!=0)
				{
					if (C[S[i][j]][S[i+1][m]]!=INT_MAX)
					{
						if (F[i][j]>(F[i+1][m]+C[S[i][j]][S[i+1][m]]))
						{
							F[i][j] = F[i+1][m] + C[S[i][j]][S[i+1][m]];
							result[S[i][j]]=S[i+1][m];
							t--;
						}
					}
					m++;
				}
			}
			else
			{
				while (S[i+1][m]!=0)
				{
					if (F[i][j]>(F[i+1][m]+C[S[i][j]][S[i+1][m]]))
					{
						F[i][j] = F[i+1][m] + C[S[i][j]][S[i+1][m]];
						result[S[i][j]]=S[i+1][m];
						t--;
					}
					m++;
				}
			}
			j++;
		}
	}
	cout<<"符合条件的点为:"<<endl;
	t=0;
	result[t]=1;
	cout<<result[t]<<" ";
	t=result[t];
	while (t<N)
	{
		cout<<result[t]<<" ";
		t=result[t];
	}
	cout<<endl<<"最短距离为:";
	cout<<F[i+1][0]<<endl;
}
int main(int argc,char *argv[])
{
	int N,k;
	int i,j;
	int **C,**S,**F;//C:边的长度,S;每个阶段的状态;F:记录每个阶段的状态中的点到终点的距离
	int *result;//输出点
	cout<<"输入点的个数:";
	cin>>N;
	cout<<"输入阶段数:";
	cin>>k;
	C=new int*[N+1];
	//C=(int **)malloc(sizeof(int*)*(N+1));
	for (i=0;i<N+1;i++)
	{
		//C[i]=(int *)malloc(sizeof(int)*(N+1));
		C[i]=new int[N+1];
		for (j=0;j<N+1;j++)
		{
			C[i][j]=INT_MAX;
		}
	}
	S= new int*[N+1];
	for (i=0;i<N+1;i++)
	{
		S[i]=new int[N+1];
		memset(S[i],0,sizeof(int)*(N+1));
	}
	F=new int *[N+1];
	for (i=0;i<N+1;i++)
	{
		F[i]=new int [N+1];
		for (j=0;j<N+1;j++)
		{
			F[i][j]=0;
		}
	}
	result=new int[N+1];
	memset(result,0,sizeof(int)*(k+1));
	Init_Graph(N,k,S,C);
	/*
	多段图的动态规划方法
	阶段:k
	状态:Sk:即每个阶段可供选择的点的位置
	决策:u
	规划方程:f(k)=min(f(k+1)+边u的长度。
	f(k)表示:k点到终点的最短路径长度
	初始值:F(k)=0;
    */
	Plan(N,k,S,F,C,result);
	delete []result;
	for (i=0;i<N+1;i++)
	{
		delete []C[i];
	}
	delete []C;
	for (i=0;i<N+1;i++)
	{
		delete []S[i];
	}
	delete []S;
	for (i=0;i<N+1;i++)
	{
		delete []F[i];
	}
	delete []F;
	return 0;
}



运行结果如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多段图的最短路径问题-----动态规划法 的相关文章

  • 基于Unity3D平台的三维虚拟城市研究与应用

    0 引 言 随着现代城市的不断拓展延伸 城市空间多层次 立体模式管理逐渐成为城市规划管理的发展趋势 1 实现城市空间信息管理模式从二维到三维的转变 三维虚拟城市技术 已经成为人们关注和研究的热点 2 三维虚拟系统具有多维信息处理 表达和分析
  • unity:C#控制人在真实环境中行走

    自己在学习unity的课程中遇到了 xff0c 有的地方还没怎么太理解上去 xff0c 先做个笔记 xff0c 顺便看看有没有需要的人 1 搭建一个小场景 xff0c 一个需要控制的 人 xff08 添加CharacterControlle
  • unity 3D:自动寻路

    首先 xff0c 搭建一下场景 xff0c 场景要求 xff1a 有遮挡 xff0c 设置好不可走区域为navigation static 以及 not walkable 在人身上添加Nav Mesh Agent 设置好后勾选显示导航网格
  • 数据结构 ——c++实现(知识点集合)

    数据结构 c 43 43 实现 xff08 知识点集合 xff09 某不知名学狗的复习记录 xff0c 包含数据结构基本概念 xff0c 线性表 xff0c 栈 队列 递归 xff0c 串 数组 广义表和树和森林内容整理 主要整理了知识点
  • Unity3D 使用SceneManager跳转/加载场景

    很久没有更新博客了 xff0c 最近也是还在学习U3D 下面写一下使用SceneManager跳转 加载场景 我们假设要点击一个按钮跳转 xff0c 那么我们只要把跳转的代码写进按钮点击事件里就好了 其实加载场景很简单 xff0c 只需要写
  • [OpenCV] aruco Markers识别 小车巡线

    小车巡线代码 include lt ros ros h gt include lt sensor msgs Image h gt include lt geometry msgs Twist h gt include lt cv bridg
  • 备份ubuntu

    在使用Ubuntu之前 xff0c 相信很多人都有过使用Windows系统的经历 如果你备份过Windows系统 xff0c 那么你一定记忆犹新 xff1a 首先需要找到一个备份工 具 通常都是私有软件 xff0c 然后重启电脑进入备份工具
  • Docker - docker build 命令详解

    docker build 命令原理 docker build 命令从 Dockerfile 和上下文构建镜像构建的上下文 xff1a 位于指定 PATH 或 URL 中的一组文件构建过程可以引用上下文中的任何文件 xff0c 例如 xff0
  • RealSense二次开发

    转载 xff1a librealsense2查看相机设备信息 JavaShuo 文章目录 1 librealsense2设备信息读取 xff12 xff0e realsense 投影函数和反投影函数3 深度相机与彩色相机的坐标变换 1 li
  • 大规模MIP的精确算法和实现

    大规模MIP的精确算法和实现 大规模MIP的精确算法和实现 xff1a 目录第1部分 xff1a CPLEX的Java API详解1 CPLEX简介2 构建简单的模型3 CPLEX的高级应用 第2部分 xff1a Gurobi的Python
  • 两种Dockerfile文件配置

    注意 xff1a xxx是您的项目名称 xff01 Xmx xff1a 堆最大值 xff1b Xms xff1a 堆初始值 COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中 而ADD指令还支持通过URL从远程
  • 网络编程-----在线词典项目(服务器)

    服务器端 span class token macro property span class token directive keyword include span span class token string lt stdio h
  • 模型的图优化

    图优化 最近在整理之前的一些工作内容 记录下来温故而知新 在各种开源推理框架中 xff0c 我们总能看到有一种graph optimizer技术 xff0c 主要是对用户想要运行的网络模型进行一种网络结构层面的优化 xff0c 剔除不需要的
  • 学C++有多难,你知道吗?

    都2020年了 xff0c 还要学C 43 43 吗 xff1f C 43 43 好多理工科大学里面都有 xff0c 它的学习难度比其他编程语言比如Python Javascript 和Java等等难 那为什么呢 xff1f C 43 43
  • Ubuntu-KCF/DSST算法无人机跟踪仿真/实物保姆级教程

    KCF算法无人机跟踪 介绍 自己搭建的无人机跟踪实验 xff0c 主要讲软件 xff0c 硬件的需要等等 基础知识准备 整个系统需要两部分 xff0c 识别程序和控制无人机运动的程序 xff0c 都是Python脚本 xff0c 但运行需要
  • Linux基础入门:单片机和Linux有什么不同吗

    我发现很多初学者只有单片机基础 xff0c 甚至没有单片机基础 在学习Linux时 xff0c 对很多概念比较陌生 xff0c 导致不知道学什么 xff0c 也不知道学了之后有什么用 所以小编在此分享此文 第1章 单片机和Linux的区别
  • 为什么都说代码改变世界?是因为这五位程序员创造了未来!

    致敬那些为软件开发奠定坚实基础的计算机科学先驱 从 1 和 0 开始 xff0c 编程经历了很长一段路 xff0c 才达到了现在的抽象状态 过去的程序员用伟大的发明 xff0c 为现代程序员轻松地完成工作奠定了坚实的基础 如果我们研究某个软
  • C语言丨关键字enum用法详解,看这篇就够了

    一 关键字enum的定义 enum是C语言中的一个关键字 xff0c enum叫枚举数据类型 xff0c 枚举数据类型描述的是一组整型值的集合 xff08 这句话其实不太妥当 xff09 xff0c 枚举型是预处理指令 define的替代
  • Ubuntu下cmake使用入门

    CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 其包含自己的语法结构 xff0c 只要按照其语法编写成
  • Windows与Linux双系统设置默认引导项与删除引导项

    当电脑中安装了Windows和Linux双系统 xff0c 但是每次开机默认自动进入Linux系统时 xff0c 有时根本来不及选择 xff0c 平时常用的系统却是Windows xff0c 于是我们需要让电脑默认选择Windows系统启动

随机推荐

  • 统招非全日制研究生就业受歧视的回应文件

    根据教育部办公厅等五部门 关于进一步做好非全日制研究生就业工作的通知 教研厅函 2019 1号 以及教育部办公厅印发 关于统筹全日制和非全日制研究生管理工作的通知 教研厅函 2016 2号 文件 xff0c 明确自2017年起 xff0c
  • IOTDB集群部署

    背景 IOTDB单节点的数据插入性能不是很好 xff0c 所以 xff0c 想看看集群的效果 xff0c 那么就需要搭建集群的环境 文件获取 下载地址 选择集群版本 文件目录 完成IoTDB Cluster安装后 xff0c 默认会在IoT
  • 全球超1850万条POI数据获取方法

    POI是 Point of Interest 的缩写 xff0c 中文可以翻译为 兴趣点 在地理信息系统中 xff0c 一个POI可以是一栋房子 一个商铺 一个邮筒 一个公交站等 数据获取 xff1a 数据分享 全球超1850万条 POI数
  • 百度网盘普通用户如何上传单文件最大4G文件。window split命令如何分割文件上传。

    普通用户使用百度网盘Web端上传文件时 xff0c 单文件最大支持1G大小 xff1b 使用网盘PC客户端上传文件时 xff0c 单文件最大支持4G xff1b 如果您需要上传大于4G文件 xff0c 可充值百度网盘会员 xff0c 其中
  • FreeRTOS 框架

    官网 章节目录规划 Kernel taskmemory managementqueue mutex semaphoretime managesoftware timerinterrupt process FreeRTOS plus Free
  • 飞行器设计之界限线图

    推重比与翼载荷约束分析 主要性能要求可以表示为最小起飞推重比T W和起飞翼载荷W S的函数 xff0c 每一项性能要求可以在起飞推重比T W 起飞翼载荷W S坐标中构成一条约束曲线 采用能量守恒方程 xff0c 推导出飞机性能约束的一般主管
  • FreeRTOS中使用中断的一些注意事项

    1 几个宏定义的解释 configLIBRARY LOWEST INTERRUPT PRIORITY 这个宏是可以定义的中断最低优先级 xff0c 由于STM32中断管理只用了4位来分配抢占优先级和子优先级 xff0c 并且FreeRTOS
  • 软路由cpu性能跑分

    软路由cpu性能跑分 cpu核心功耗单核多核N50304 46W14052909N50004 46W11522608N41204 46W11072477N41004 46W9952238N42004 46W8362027N34504 46W
  • k8s中pod的基本概念以及pod内资源共享的分析与实现

    目录 pod基本概念 xff1a pod的主要用法 pod资源共享实现机制 pod网络共享测试案例 xff1a 存储共享 pod存储共享测试案例 xff1a pod管理命令 常用的pod管理命令 定义pod pod基本概念 xff1a po
  • 迅雷笔试题2014校园招聘 武汉

  • C#中的readonly与const区别

    xfeff xfeff const 的概念就是一个包含不能修改的值的变量 常数表达式是在编译时可被完全计算的表达式 因此不能从一个变量中提取的值来初始化常量 如果 const int a 61 b 43 1 b是一个变量 xff0c 显然不
  • 改变无线连接、有线连接的优先级

    有线和无线连的是同一个网络 xff0c 当笔记本打开时 xff0c 总是优先使用无线连接 xff0c 如何转变优先级为有线连接呢 xff1f 1 打开网络和共享中心 2 更改适配器设置 xff0c 打开网络连接窗口 3 单击此窗口的高级菜单
  • 杂感一

    从2014年7月工作至今已有快2年了 xff0c csdn的博客从毕业后就很少上了 工作中有很多收获 技术上 也在不断积累和成长中 不管做什么事情 xff0c 要坚持下去 xff0c 方得初心 xff0c 把坚持养成习惯 xff0c 学习如
  • MFC隐藏主窗口的方法

    隐藏基于对话框的MFC应用程序窗口的方法 推荐这个方法 xff0c 非常好用 很多人可能会将窗口创建出来 然后用一个 ShowWindow SW HIDE 的方法去隐藏窗口 当然这是可以做到隐藏的功能 但是有一点不足的地方就是窗口在隐藏之前
  • JSP 通过Servlet将excel数据导入SQL

    1 gt 在网上下载jxl jar 这个JAR包用于Java操作excel 下载后 xff0c 将这个包复制到工程Webroot下的WEB INF下的lib中 xff0c 或是在工程中导入jxl jar包 2 gt 准备excel文件 如图
  • 1=5,2=15,3=215,4=2145,那么5=?

    如题 xff0c 1 61 5 xff0c 2 61 15 xff0c 3 61 215 xff0c 4 61 2145 xff0c 那么5 61 xff1f 答案 xff1a 5 61 1 哎 xff0c 这个题出的 xff0c 没反应过
  • 数值分析上机题Matlab--东南大学出版社(牛顿迭代/逐次超松弛迭代/3次样条插值/复合梯形SimpsonRomberg/四阶经典Runge-Kutta/幂法求特征向量)

    第二章上机题 Newton迭代法 function x err 61 Newton f x0 epsilon 用例 xff1a x err 61 Newton 39 x 3 3 x 39 0 7 0 005 Input f 字符串公式 39
  • 村子里有50个人,每人有一条狗,在这50条狗中有病狗(这种病不传染),于是人们要找出病狗。

    xff29 xff22 xff2d 公司向来以高素质人才作为企业持续竞争力的保证 进入 xff29 xff22 xff2d 公司是差不多每个 xff29 xff34 人的梦想 下面这条 xff29 xff22 xff2d 公司的面试题 xf
  • 删除单向链表中的某一个节点

    已知一个单向链表的表头head xff0c 写出一个删除某一个节点的算法 xff0c 要求先找到此节点 xff0c 然后删除 include lt iostream gt using namespace std typedef struct
  • 多段图的最短路径问题-----动态规划法

    对多段图 xff0c 求最短路径 xff0c 如图 xff1a 对其使用动态规划法 xff1a 阶段 xff1a 将图中的顶点划分5个阶段 xff0c k 状态 xff1a 每个阶段有几种供选择的点s 决策 xff1a 当前状态应在前一个状