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

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(使用前将#替换为@)

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

  • Java高级特性泛型看这一篇就够了

    泛型在我们工作中用到的很多 xff0c 但是很多同学其实对泛型不怎么了解 xff0c 包括我 xff0c 所以我们来一起学习一下泛型 xff0c 主要是从以下几点来介绍一下泛型为什么需要泛型 泛型类和泛型接口的定义 xff0c 泛型方法的辨
  • 基于链表的内存池算法

    include 34 head h 34 define INITPOOL 5000 每个的内存池的初始大小 define ADDPOOL 5000 每个新增的内存池的初始大小 define Byte 44 每个新分配内存字节数 typede
  • ubuntu linux下开启远程唤醒

    目录 启动远程唤醒 xff0c 需要主板支持才能进行 步骤一 xff1a 检查计算机硬件是否支持WOL wake on lan 功能 步骤二 xff1a 检查主板和电源是否支持WOL 步骤三 xff1a 检查网卡是否支持WOL 步骤四 xf
  • Depends:xxx but it is not going to be installed

    最近在Ubuntu16 04上编译opencv xff0c 但从最开始就遇到了头大的问题 xff0c 在下载安装依赖项时遇到Depends xff1a xxx but it is not going to be installed xff0
  • 打开计算机的管理需要在控制面板中创建关联

    今天在工作中发现当我选择计算机 管理时提示我需要在控制面板中创建关联 xff0c 如下图所示 xff1a 于是 xff0c 我便上百度搜索了一下 xff0c 答案是这样的 xff1a 修改 span style font family no
  • ftp身份认证时登录框反复弹出以及ftp常用配置

    1 若我们想访问一个人的ftp站点 xff0c 直接通过浏览器直接访问就可以了 xff08 ftp 要访问主机A的IP地址 xff09 如果对方开启了基本身份认证的话 xff0c 我们就需要输入正确的用户名及密码才可正常访问 xff0c 即
  • Linux下挂载U盘、ISO、光盘、rpm

    1 挂载U盘 1 xff09 将U盘连接到虚拟机后 xff0c 使用fdisk l xff08 注意 xff0c 这是list单词的首字母l xff09 命令查看当前U盘的设备符号 2 xff09 创建目录 mnt usb xff0c 以备
  • unity 3D学习日记:创建一个小场景并编写简单C#移动脚本

    学习Unity 3D第一周 xff0c 完成的目标一是创建一个小场景 xff0c 用角色控制器在场景里行走 xff1b 二是编写一个简单的移动脚本 一 创建一个小场景 xff0c 用角色控制器在场景里行走 1 先安装Unity 3D 5 3
  • 基于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 设置好后勾选显示导航网格
  • Java高级特性反射与动态代理模式

    文章目录 前言一 了解反射二 继续了解反射 xff08 哈哈哈 xff09 1 每一个类对应的class放在哪里 xff1f 2 这个class里面都保存了什么3 如何使用 xff1f 3 1 获取类加载器3 2 获取构造器对象3 3 获取
  • Unity3D 使用SceneManager跳转/加载场景

    很久没有更新博客了 xff0c 最近也是还在学习U3D 下面写一下使用SceneManager跳转 加载场景 我们假设要点击一个按钮跳转 xff0c 那么我们只要把跳转的代码写进按钮点击事件里就好了 其实加载场景很简单 xff0c 只需要写
  • Hisat2 Bowtie2比对结果解读

    Bowtie的中文意思是 xff1a 领结 xff0c 蝴蝶结 Bowtie2用户手册 xff1a http bowtie bio sourceforge net bowtie2 manual shtml 在看比对结果前需要了解三个概念 x
  • React 项目启动报错:The “path” argument must be of type string

    今天下载一个旧的React项目 xff0c yarn start 运行 xff0c 报错 xff1a TypeError ERR INVALID ARG TYPE The path argument must be of type stri
  • Android 身份认证基本概念

    身份验证 Android 采用通过用户身份验证把关的加密密钥机制 xff0c 该机制需要以下组件 xff1a 加密密钥存储和服务提供程序 存储加密密钥并基于这些密钥提供标准加密例程 Android 支持由硬件支持的密钥库和 Keymaste
  • Gnome增加消息提醒extension 适用于聊天工具如xchat "message notifier" "notifications alert" "permanent notification&quo

    使用如xchat这样的聊天工具 xff0c 有人跟你说话时 xff0c 在KDE桌面中 xff0c 默认系统托盘中的xchat托盘会闪烁 xff0c 直到你点击将xchat切换到前台 xff0c 这是xchat在preference可以设置
  • 读取文件报错:FileNotFoundError: [Errno 2] No such file or directory

    文章目录 问题描述问题分析解决办法 问题描述 使用 img 61 Image open 39 data DSC 8923 jpg 39 读取一张图片时 xff0c 报 FileNotFoundError Errno 2 No such fi
  • CentOS7离线安装图像化界面踩坑及脱坑历程

    CentOS7离线安装图像化界面 背景安装问题尝试一 xff1a 尝试二 xff1a 其他问题总结 背景 很久之前实验室的一台服务器安装了CentOS 7 6 1810版本的linux系统 xff0c 然而当时安装系统的同学不知出于什么目的
  • Eslint 配置及规则说明

    中文官方网站 基本使用教程 安装 可以全局安装 xff0c 也可以在项目下面安装 如下是在项目中安装示例 xff0c 只需要在 package json 中添加如下配置 xff0c 并进行安装 xff1a gt 34 eslint 34 3

随机推荐

  • Ubuntu自动登录图形系统界面(免密码、开机自启动)

    Ubuntu自动登录图形系统界面 xff08 免密码 开机自启动 xff09 操作系统版本 xff1a 18 04 修改50 unity greeter conf xff0c 使其允许root登录 span class token func
  • 学C++有多难,你知道吗?

    都2020年了 xff0c 还要学C 43 43 吗 xff1f C 43 43 好多理工科大学里面都有 xff0c 它的学习难度比其他编程语言比如Python Javascript 和Java等等难 那为什么呢 xff1f C 43 43
  • 搞懂Java高级特性--注解

    1 注解是什么 xff1f Java注解 xff08 Annotation xff09 又称Java标注 xff0c 是JDK5 0引入的一种注释机制 xff0c 注解是元数据的一种形式 xff0c 提供有关于程序但不属于程序本身的数据 x
  • 为什么都说代码改变世界?是因为这五位程序员创造了未来!

    致敬那些为软件开发奠定坚实基础的计算机科学先驱 从 1 和 0 开始 xff0c 编程经历了很长一段路 xff0c 才达到了现在的抽象状态 过去的程序员用伟大的发明 xff0c 为现代程序员轻松地完成工作奠定了坚实的基础 如果我们研究某个软
  • 编译提示缺少libjli.so,jar command not found,javadoc错误等

    这周一周忙于Ubuntu server环境下的Android编译环境的搭建 xff0c 由于刚开始真正使用Linux xff0c xff08 以前虽然用过Ubuntu xff0c 但是就当win用了 就这样还没坚持下来 xff0c 现在工作
  • 银河麒麟系统4.0.2离线安装MySQL教程

    银河麒麟系统4 0 2离线安装MySQL教程 xff08 Ubuntu离线安装MySQL教程 xff09 https www jianshu com p 478dc7c9b9e0 这个教程很详细 xff0c 我不再多说 xff0c 而且亲测
  • 实现线程同步的几种方式

    在多线程中线程的执行顺序是依靠哪个线程先获得到CUP的执行权谁就先执行 xff0c 虽然说可以通过线程的优先权进行设置 xff0c 但是他只是获取CUP执行权的概率高点 xff0c 但是也不一定必须先执行 在这种情况下如何保证线程按照一定的
  • STC开天斧虚拟示波器使用

    开天斧外观图 xff0c 颜值非常可以 1 在keil中添加STC8H8K64U的型号和头文件 xff0c 添加功能在STC IPS软件里 首先点击Keil仿真设置 xff0c 然后选择单片机型号STC8H8K64U xff0c 然后点击添
  • android AlertDialog 弹窗自定义布局 点击外部不关闭弹窗

    AlertDialog span class token punctuation span Builder builder span class token operator 61 span span class token keyword
  • delete释放new[] 以及 delete[]释放new 的问题

    在同花顺 的笔试过程中遇到这么一个类似问题 A ptr 61 new A 10 for int i 61 0 i lt n i 43 43 delete amp ptr i 由此衍生出两个问题 new 申请的空间用delete释放会发生什么
  • 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 学习如
  • Kotlin实战---Retrofit网络模型

    没有Kotlin基础的小伙伴先进这里 Koltin基础文章 1 Java和Kotlin互相调用之间的注意事项 1 解决关键字冲突 span class token keyword public span span class token k
  • 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 没反应过
  • 村子里有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 当前状态应在前一个状