采用动态规划来处理有向无环图最短路径问题,c++实现

news2024/11/24 11:01:42

采用动态规划来处理有向无环图最短路径问题,c++实现

  • 需求描述
  • 实现思路
  • 代码实现

需求描述

在这里插入图片描述
如图,在一个无环有向图中,找到起点0到终点的最短路径

实现思路

  1. 设s1,s2,…, st 是一条最短路径
  2. 假设s1,s2,已求出,则 s1,s2,…,st的问题则为 s2,…,st的问题
  3. 以此类推,可以将一条最短路径划分成多个子路径来求解
  4. 设公式 d(s, v) = Csv 为从s到v的权值为Csv
  5. 根据子问题的解的最小值即问题的最小值得出
  6. d(s, v) = min{d(s, u) + Cuv}
  7. 采用邻接矩阵来存储图数据
  8. 使用两个以为数组分别存储边的权值和路径,路径表示能到达当前下标的节点的点最小的权值的点
  9. 当将数据处理完后会得到如下表:
    在这里插入图片描述
  10. 回溯即可得到路径

代码实现

// 图的最短路径问题
// 1.设s1,s2,..., st 是一条最短路径
// 2. 假设s1,s2,已求出,则 s1,s2,...,st的问题则为 s2,...,st的问题
// 因此,可以划分子问题 1、d(s,v) = Csv(表示从点s到点v的最短距离),最小距离公式2、d(s, v) = min{d(s, u) + Cuv}

#include <iostream>
using namespace std;
int arc[9][9];
const int MAX = 1000; // 设置最大权值不会超过1000 

// 节点个数,起点下标,终点下标 
int shortPath(int n, int end) {
	int i, j;
	int len[n], path[n];
	// 初始化 
	for (i = 1; i < n; i++) {
		len[i] = MAX;
		path[i] = -1; 
	}
	// 设置起点 
	len[0] = 0;
	path[0] = -1;
	// 当前待处理顶点,终点 
	for (j = 1; j < n; j++) {
		// 其他顶点到待处理顶点,起点 
		for (i = j-1; i >= 0; i--) {
			//  公式2取最小值,len[j]表示目前节点的路径长度值 
			if (len[i] + arc[i][j] < len[j]) {
				// 比之前的小,重新存储更小的 
				len[j] = len[i] + arc[i][j];
				// 到节点j最近的节点i时,0-j取最短距离 
				path[j] = i;
			}
		}
	}
	cout<<"输出终点"<<end;
	i = end;
	while(path[i] >= 0) {
		cout<<"<-"<<path[i];
		// 向前走 
		i = path[i];
	};
	return len[end-1];
}
// 输出得到的矩阵
void showWeight(int n) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) 
			cout<<arc[i][j]<<"\t";
		cout<<endl;
	}
}

int main() {
	// 定义矩阵
	int i, j, k, start, end;
	int weight;
	int N;
	int count;
	cout<<"输入边的数量和节点数量";
	cin>>count>>N;
	for (i = 0; i < N; i++)
	 	for (j = 0; j < N; j++)
	 		arc[i][j] = MAX; 
	 // 初始化数据
	 for (k = 0; k < count; k++)  {
	 	cout<<"请输入边的两个顶点和权值";
		 cin>>i>>j>>weight;
		 arc[i][j] = weight;
	 }
	 showWeight(N);
	 cout<<"输入终点";
	cin>>end;
	 shortPath(N, end);
	 return 0;
}

输出结果:
在这里插入图片描述

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

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

相关文章

JS 事件循环机制、调用栈、堆、主线程、宏任务队列、微任务队列、缓存管理之间的关系

一、事件循环机制 你是否想过&#xff0c;在控制台执行代码时&#xff0c;为什么能立即得到响应&#xff1f; 实际上&#xff0c;底层有一套模型机制叫 事件循环&#xff0c;换句话说&#xff0c;它是一个”死循环“&#xff0c; 里面负责监听&执行我们写的 JS 代码&#…

spring+springMVC+mybatis实现的物业管理系统

本系统借用了前辈的页面框架来实现了一个物业管理系统&#xff0c;使用到的主要技术有&#xff1a;SSM框架&#xff0c;MySql 8.0数据库&#xff0c;tomcat 8.0&#xff0c;使用maven进行依赖管理&#xff0c;前端页面使用的是jsp。整个系统分为用户端和管理员端。 用户端功能有…

Vue.js 中的权限控制是什么?如何进行权限控制?

Vue.js 中的权限控制是什么&#xff1f;如何进行权限控制&#xff1f; 在现代 Web 应用程序中&#xff0c;权限控制是一个重要的话题。Vue.js 作为一种现代的前端框架&#xff0c;提供了一些有用的工具和技术来实现权限控制。本文将介绍 Vue.js 中的权限控制的概念、作用以及如…

一文教你认清云渲染的优势和劣势

在当今数字化时代&#xff0c;云渲染作为一项创新的技术方案&#xff0c;正逐渐成为许多行业中的热门话题。与传统的本地渲染相比&#xff0c;云渲染具备许多独特的优势和劣势。本文将深入探讨云渲染的各项特点&#xff0c;帮助您全面了解这一技术&#xff0c;并为您提供有关云…

js+canvas实现劈腿关系图

【我愿称多对一 一对多关系为劈腿关系】 【仓库地址】gitgithub.com:yyccmmkk/rl.git 【显示所有线路细节】 【合并线路】 【合并同一个目标点线路】 【合并同一个出发点线路】 【数据结构】 原始数据只需要提供节点自身id 父点节id&#xff0c;劈腿关系图自动处理 [{id:z…

基于CSDN上海城市开发者社区第一次线下沙龙的筹备经验分享

引言 由于时间较为紧张、邹老师行程安排紧凑等因素影响&#xff0c;结合实际情况&#xff0c;改茶话会为聚餐&#xff0c;所以在举办线下沙龙的时候一定要根据实际情况来斟酌活动形式。本次活动是和哈士奇&#xff0c;哈哥一起筹备&#xff0c;也得到了哈哥的大力支持&#xff…

如何进行物联网开发可以快速完成产品研发?

物联网产品的研发与开发过程&#xff0c;是一个不断探索、创新、实践的过程&#xff0c;需要很长的周期&#xff0c;在这个过程中&#xff0c;项目团队往往需要投入大量的人力、物力和时间。同时&#xff0c;物联网产品研发过程中还涉及到大量的专业技术和知识&#xff0c;需要…

从git上拉取项目

目录 一、前期准备&#xff0c;获取git下载链接 二、idea下载 2.1.打开git下载界面 2.2.进入下载界面 2.3.下载前期配置 2.4.输入账号密码 2.5.下载完成后idea打开 2.6.下载完成后文件目录展示 三、命令行下载 3.1.打开所需要下载的项目路径 3.2.进入黑窗口 …

【算法系列之数组I】leetcode54.螺旋矩阵

704. 二分查找 力扣题目链接 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 输入: nums [-1,0,3,5,9,12], target 9…

【618备战巡礼】“三高”之第一高--如何打造高可用系统 | 京东云技术团队

前言 我们经常会说互联网“三高”&#xff0c;那什么是三高呢&#xff1f;我们常说的三高&#xff0c;高并发、高可用、高性能&#xff0c;这些技术是构建现代互联网应用程序所必需的。对于京东618备战来说&#xff0c;所有的中台系统服务&#xff0c;无疑都是围绕着三高来展开…

一文说清DC-DC BUCK电路(非常详细)

目录 摘要 BUCK原理 DC-DC芯片框图 自举电容 输出电感 输出电容和纹波 损耗 总结 摘要 DC-DC BUCK&#xff0c;是硬件工程师工作中使用频率非常高的电路&#xff0c;可以这么说&#xff0c;只要板子不是迷你型的&#xff0c;十有八九都有DC-DC。因此&#xff0c;对它的…

Win10安装mac虚拟机

参考文章 按照上面的参考文章进行了安装并完成了安装&#xff0c;结合安装过程中遇到的问题&#xff0c;进行一个总结。 要想在win10上安装mac虚拟机&#xff0c;需要准备三样东西&#xff1a; &#xff08;1&#xff09;虚拟机平台&#xff1a;用来装载mac虚拟机 &#xf…

【分布族谱】学生t分布,及其与正态分布、卡方分布的关系

文章目录 简介正态分布与卡方分布用scipy来验证三者关系 简介 1908年&#xff0c;戈塞特在酿酒厂工作&#xff0c;由于酒厂禁止员工发表酿酒相关的研究成果&#xff0c;所以他以Student为笔名发表了有关t分布的研究&#xff0c;故而这个著名的分布被命名为学生分布。 如果有两…

计算机基础--->操作系统(3)【内存管理】

文章目录 内存管理内存管理主要做什么&#xff1f;什么是内存碎片&#xff1f;常见内存管理方式虚拟内存什么是虚拟内存&#xff1f;虚拟内存的作用&#xff1f;没有虚拟内存的问题什么是虚拟地址和物理地址&#xff1f; 分段机制分页机制转址旁路缓存&#xff08;TLB、快表&am…

MySQL唯一约束失效深度剖析

详细情况&#xff1a; 业务反馈&#xff1a;“用int查出来有两条数据&#xff0c;char类型查出来只有一条数据 &#xff0c;这几个字段还是uk的 ”&#xff08;版本MySQL 5.7.25&#xff09; 表结构如下&#xff1a; CREATE TABLE test_table (id bigint(20) NOT NULL AUTO_IN…

构建方便残障人士使用的网站 web enhance the accessibility

文章目录 前言检测网站是否符合残障人士使用window版软件edge浏览器插件版 前端开发为残障人士的通用标准img标签a标签字体与颜色显示或隐藏的元素可交互的元素标记元素类别 总结 前言 网站的构建往往会忽略一群特殊的人群&#xff0c;在某些方便存在障碍的网民&#xff0c;比…

Docker镜像管理

Docker 概述 Docker是什么 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移…

基于状态的维护(CBM)如何推动设备效率提高?

基于状态的维护&#xff08;Condition-Based Maintenance&#xff0c;CBM&#xff09;是一种先进的维护策略&#xff0c;通过实时监测和分析设备的状态数据&#xff0c;预测设备故障并采取相应的维护措施。CBM基于数据驱动的方法&#xff0c;能够提高设备的可用性、降低维修成本…

PDF怎么转成PPT文件免费?分享几个方法!

PDF文件和PPT文件是常见的两类文件&#xff0c;广泛应用于打工人和学生党之间。每种文件格式都有自己的优势&#xff0c;在不同的情况下使用。PDF格式具有出色的浏览效果&#xff0c;能有效保护文档内容免受随意篡改&#xff0c;而且在传输过程中不会出现乱码问题。然而&#x…

Apifox 发请求时如何自动获取Cookie 和 token

介绍 用户登录到网站或 App 是非常常见的的场景&#xff0c;登录成功后一般会返回登录凭证&#xff08;一般为 Cookie 或者 token&#xff09;&#xff0c;后续其它接口发起请求时会携带 Cookie 或者 token 到服务器进行校验。校验通过&#xff0c;则返回相关的数据&#xff0…