算法项目报告:物流中的最短路径问题
问题描述
物流问题
有一个物流公司需要从起点A到终点B进行货物运输,在运输过程中,该公司需要途径多个不同的城市,并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间,该公司需要确定经过哪些配送站点,并且给出完成货物运输的最短路径长度。
路线分布图
问题分析
问题简化
可以将该问题抽象为多段图的最短路径问题,其中每个城市对应图中的一个节点,不同城市之间的距离对应着图中的边权,城市内部的配送站可以看作同一个节点。从起点A到终点B的货物运输路径可以表示为多段图中的一条路径。找到起点A到终点B的最短路径并给出路径长度即可求解此问题。
路线简化图
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
元素值 | 4 | 8 | 6 | 10 | 8 | 12 | 14 | 17 | 15 |
状态转换 | 0->1 | 0->2 | 0->3 | 1->4 | 3->5 | 5->6 | 5->7 | 5->8 | 7->9 |
最短路径为:0->3->5->7->9,最短路径长度为15
算法设计
算法设计分析
多段图的最短路径问题满足最优性原理,可以使用动态规划法求解。
设Cuv表示多段图的有向边<u,v>上的权值,从源点s到终点t的最短路径长度记为d(s,t),原问题的部分解d(s,v),则下式成立:
d(s,v)=Csv (<s,v>∈E)
d(s,v)=min{d(s,u)+Cuv} (<u,v>∈E)
数组arc[n][n]存储图的代价矩阵,数组cost[n]存储最短路径长度,cost[j]表示从源点s到顶点j的最短路径长度,数组path[n]记录转移状态,path[j]表示从源点s到顶点j的路径上顶点j的前一个顶点。
算法伪代码
输入:多段图的代价矩阵
输出:最短路径长度及路径c[n][n]
1.循环变量j从1~n-1重复下述操作,执行填表工作
1.1考察顶点j的所有入边,对于边<i,j>∈E,执行下述操作
1.1.1cost[j]=min{cost[i]+c[i][j]}
1.1.2path[j]=使cost[i]+c[i][j]最小的i
1.2 j++
2.输出最短路径长度cost[n-1]
3.循环变量i=path[n-1],循环直到path[i]=0,输出最短路径经过的顶点
3.1输出path[i]
3.2 i=path[i]
实验结果
最短路径
最短路径为:0->3->5->7->9,最短路径长度是15
算法分析
时间复杂度分析
算法第一部分是依次计算从源点到各个顶点的最短路径长度,由两层循环嵌套组成,外层循环执行n-1次,内层循环对所有入边进行计算,在所有循环中,每条入边只计算一次。假设图的边数为m,时间复杂度为O(m);第二部分是输出最短路径经过的顶点,设多段图划分为k段,时间复杂度为O(k)。整个算法的时间复杂度为O(m+k)。
空间复杂度分析
算法的空间复杂度主要体现在图的代价矩阵arc[n][n]的存储,空间复杂度为O(n^2),存储最短路径长度的数组cost[n]的空间复杂度为O(n),转移状态记录数组path[n]的空间复杂度为O(n),所以整个算法的空间复杂度为O(n^2)。
源代码
#include<iostream>
using namespace std;
#define INF 999
int arc[10][10]; // 最多10个点
int CreateGraph()
{int i, j, k;int weight;int vnum, arcnum;cout << "请输入顶点和边的个数:";cin >> vnum >> arcnum;for (int i = 0; i < vnum; i++) // 初始化图的代价矩阵 for (int j = 0; j < vnum; j++)arc[i][j] = INF;for (k = 0; k < arcnum; k++){cout << "请输入第" << k + 1 << "条边的两个顶点和权值:";cin >> i >> j >> weight;arc[i][j] = weight;}return vnum; // 返回顶点的个数
}
// 求 n个顶点的多段图的最短路径
int BackPath(int n)
{int i, j, temp;int cost[100], path[100]; // 存储路径长度和路径 for (i = 1; i < n; i++){cost[i] = INF;path[i] = -1;}cost[0] = 0; // 顶点0为源点 path[0] = -1;for (j = 1; j < n; j++) // 依次计算后面下标为1到n-1的点(填表) for (i = j - 1; i >= 0; i--){if (cost[i] + arc[i][j] < cost[j]){cost[j] = cost[i] + arc[i][j]; // 更新值 path[j] = i; // 记录前一个点 }}// 输出路径i = n - 1;cout << "最短路径为:" << i;while (path[i] >= 0)// 前一个点大于0 {cout << "<-" << path[i];i = path[i]; // 更新为前一个点 }cout << endl;return cost[n - 1]; // 返回最短路径长度
}
int main()
{int graph = CreateGraph();cout << "最短路径长度为:" << BackPath(graph) << endl;return 0;
}
感谢大家的观看
相关文章:

算法项目报告:物流中的最短路径问题
问题描述 物流问题 有一个物流公司需要从起点A到终点B进行货物运输,在运输过程中,该公司需要途径多个不同的城市,并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间,该公司需要确定经过哪些配送站点ÿ…...
linux中 crontab 定时器用法
*/10 * * * * python3 /home/code/haha2.py Crontab 当然,以下是一个简短的博客,介绍了 Cron 和 Crontab 的用法: --- # 简介:使用 Cron 和 Crontab 在 Linux 中进行定时任务调度 在 Linux 系统中,Cron 是一个用于…...
java算法day16
java算法day16 112 路径总和404 左叶子之和513 找树左下角的值 112 路径总和 题型判定为自顶向下类型,并且为路径和类型。 那就套模板。 自顶向下就是从上到下处理,那么就是前序遍历的思想。 class Solution {boolean res false;public boolean hasP…...

华为HCIP Datacom H12-821 卷41
1.多选题 以下关于BGP Atomic_Aggregate和Aggregator的描述,正确的是哪些项? A、Aggregator属性属于可选过渡属性 B、Atomic_Aggregate属于公认任意属性 C、收到携带Atomic_Aggregate属性的路由表示这条路由不能再度明细化 D、 Agregator表示某条路由可能出现…...

【React Hooks原理 - forwardRef、useImperativeHandle】
概述 上文我们聊了useRef的使用和实现,主要两个用途:1、用于持久化保存 2、用于绑定dom。 但是有时候我们需要在父组件中访问子组件的dom或者属性/方法,而React中默认是不允许父组件直接访问子组件的dom的,这时候就可以通过forwa…...
用于可穿戴传感器的人类活动识别、健康监测和行为建模的大型语言模型
这篇论文题为《用于可穿戴传感器的人类活动识别、健康监测和行为建模的大型语言模型:早期趋势、数据集和挑战的综述》,由埃米利奥费拉拉(Emilio Ferrara)撰写。论文主要内容如下: 摘要 可穿戴技术的普及使得传感器数…...

react事件绑定
react基础事件绑定 function passwordChange(e){console.log(e.target.value); } function usernameChange(e){console.log(e.target.value); }function App() {return (<div><input type"text" placeholder请输入用户名onChange{usernameChange}/><i…...

spring框架之AOP注解方式(java代码实例)
目录 半注解形式: 业务层接口实现类: 编写切面类: 在配置文件里面唯一需要加的: 测试类: 全注解形式: 不要配置文件,改为配置类: 同样的业务层接口实现类: 同样的…...

windows下gcc编译C、C++程序 MinGW编译器
文章目录 1、概要2、MinGW安装2.1 编译器下载2.2 编译器安装2.3 设置环境变量2.4 查看gcc版本信息 3、编译C、C程序3.1 编写Hello World.c3.2 编译C程序3.3 运行程序3.4 编译C程序 1、概要 GCC原名为GNU C语言编译器(GNU C Compiler),只能处…...

uniapp启动图延时效果,启动图的配置
今天阐述uniapp开发中给启动图做延迟效果,不然启动图太快了,一闪就过去了; 一:修改配置文件:manifest.json "app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"…...

SQL,python,knime将数据混合的文字数字拆出来,合并计算(学习笔记)
将下面将数据混合的文字数字拆出来,合并计算 一、SQL解决: ---创建表插入数据 CREATE TABLE original_data (id INT AUTO_INCREMENT PRIMARY KEY,city VARCHAR(255),value DECIMAL(10, 2) );INSERT INTO original_data (city, value) VALUES (上海0.5…...

【算法】LRU缓存
难度:中等 题目: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,…...

解决elementUI列表的疑难杂症,排序显示错乱的问题
大家好,在使用elementUI表格时,有时会出现一些意料之外的问题,比如数据排序正常但表格显示、排序错乱等。在网上搜索后一般有2种解决方法:1.给表格每一项的el-table-column添加唯一的id用于区分。2.给表格每一项的el-table-column…...

重大消息:手机车机互联投屏专题发布-千里马带你学框架
背景: android投屏的使用场景以前在新能源车机还没火爆时候,大部分停留在手机小屏幕投屏到大屏幕的情况及整个多端设备的互动,整体需求和技术发展其实也就是比较有限,但是新能源车机火爆后,那么这种手机和车机互联互动…...
jail子系统里升级Ubuntu focal到jammy
Ubuntu focal是20.04 ,jammy版本是22.04,本次的目的就是将FreeBSD jail子系统里的Ubuntu 从20.04升级到22.04 。这个focal 子系统是通过cbsd克隆得到的。使用CBSD克隆复制Ubuntu jail子系统环境-CSDN博客 do-release-upgrade升级没成功,用de…...

2024年7月20日(星期六)骑行支里山
2024年7月20日 (星期六)骑行支里山,早8:00到8:30,大观公园门口集合,9:00准时出发【因迟到者,骑行速度快者,可自行追赶偶遇。】 偶遇地点:大观公园门口集合 ,家住东,南,北…...
Python:正则表达式相关整理
最近因为一些原因频繁使用正则表达式,因为以前系统整理过关于正则表达式的相关知识,所以这里仅记录使用期间遇到的问题。 本文内容基于re包 1. match和search方法的区别 在Python中,re.search和re.match都是用于匹配字符串的正则表达式函数&a…...
ChatGPT对话:有关花卉数据集
【编者按】编者准备研究基于深度学习的花卉识别,首先需要花卉数据集。 后续,编者不断会记录研究花卉识别过程中的技术知识,敬请围观 1问:推荐一下用于深度学习的花卉数据集 ChatGPT 以下是一些用于深度学习的优秀花卉数据集&am…...
特征向量及算法
数据挖掘流程 加载数据 把需要的模型数据先计算出来 特征工程 提取数据特征,对特征数据进行清洗转化 数据的筛选和清洗数据转化 类型转为 性别 男,女 ----> 1,0特征交叉 性别/职业/收入 —> 新特这 优质男性程序员 将多个特征值组合在一起特征筛选…...

cpp 强制转换
一、static_cast static_cast 是 C 中的一个类型转换操作符,用于在类的层次结构中进行安全的向上转换(从派生类到基类)或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换(即从派生…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...