算法--最短路

news2024/11/26 18:35:41

这里写目录标题

  • xmind
  • 单源最短路
    • 简介
    • 所有边权都是正
      • 朴素的Dijkstra算法
        • 思想
        • 例子+题解
      • 堆优化版的Dijkstra算法
    • 存在负数权
      • Bellman-Ford算法
        • 思想
        • 例子+题解
  • 多源汇最短路
    • 简介

xmind

在这里插入图片描述
上述中,朴素Dijkstra算法适用于稠密图
其他用堆优化版

而SPFA算法一般都比Bellman-Ford算法要快

Floyd没得选

稠密图和稀疏图的定义:
在这里插入图片描述
其中m是边数,n是点数
当m的数据量与n方一样或者更多,那么就是稠密图,如果m跟n数据量一样,或者说更少,那么就是稀疏图

在这里插入图片描述
最短路问题,只会考察如何抽象出问题并实现代码,并不会考察算法的原理,重点在于抽象以及代码的实现

单源最短路

简介

只有一个起点,到其他某个点的最短路

所有边权都是正

朴素的Dijkstra算法

思想

在这里插入图片描述
一些解释:
s数组存放目前已经确定的最短距离的点
第一步中:dis数组是某个点到原点的距离,初始化一号点(一号点就是源点,因为图论中结点的编号都是从1开始的)的dis数值为0,其他全为一个很大的数
第二步中:for 遍历i从0到n
对于每次循环
将不在s中的距离dis最近的点给到t
把t加到s
用t来更新其他所有点的距离,如上图,如果满足dis[x]>dis[t]+w(t到x的权值),那么更新dis[x]的值为dis[t]+w的值

因为该算法适用于稠密图,所以用邻接矩阵来存储图

例子+题解

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
数据分析:n m分别是点数和边数
g数组存放某两个点的权值,例如g[a][b]=1,表示a与b之间的权值是1
dist数组用来存放某个点到原点也就是一号点的距离
st数组就是用来表示某个点的最短路已经被找到

dijkstra算法:
首先初始化dist为无穷大,用十六进制0x3f初始化即可
之后初始化dist[1]为0,因为一号点是源点

之后for循环,循环n次
首先初始化t为-1
之后,对于每个节点编号从1到n
if(某个点没有确定最短路,并且(t未被赋值,或者,j是没有确定最短路的最近的点即dist[t]>dist[j]) ),这时将j赋值给t
同时更新st[t]为true
然后对每个节点编号进行循环,用t更新其他结点的最短路
dist[j]=min(dist[j],dist[t]+g[t][j])
最后,如果dist某个点的距离仍然是0x3f(因为利用memset初始化是初始其值的三分之一即可,但是0,-1是初始化自己),那么返回-1,表示路径不存在
最后返回dist[n],这里根据具体的题目要求进行返回即可,因为题目让返回n号点
在这里插入图片描述
之所以取min,是因为该题存在自环和重边,如下:但是因为要求最短路,所以当某两个点有多个权值的时候,取权值最小的当做其权值,较大的权值就不看了
在这里插入图片描述

堆优化版的Dijkstra算法

题目与上面的题一样
在这里插入图片描述
对于add算法:
idx表示当前e数组中的可用位置,将目标点的编号存入e[]数组中,并且用一个w数组来维护权值,同时头插法:ne[idx]=h[a],h[a]=idx++
(因为e数组就是用来存节点信息的,又因为e数组所存信息的结点都是一个节点的出边节点组成的链表,所以信息就是节点的编号,所以目标结点的编号都放在e[]数组里,发出结点的编号都在h数组,所以函数里都是h[a])
在这里插入图片描述
首先是一个优先队列,其中第二第三个参数是用来改变默认排序,改成从大到小排列
用一个pari来维护一个结点编号以及该点到源点的距离

while循环条件队列不空
然后取出队头元素给到t(没有确定最短路径的点,且距离源点最近)
之后将队头元素出队
然后拿到t的编号以及到源点的距离
if(st[ver]是真),那么说明这是重边,countinue即可
之后,用t来更新其他结点的最短路径:
for循环中,遍历t结点的所有一级出边,对于每个子链结点,拿到其存在e数组中的编号之后给j
之后更新
之后出队j的pair:{dist[j],j}

在这里插入图片描述

存在负数权

Bellman-Ford算法

思想

在这里插入图片描述
上面的方框是算法过程,下面的圆是经过该算法之后出现的现象,即对于每个a,b:dist[b]<=dist[a]+w,俗称三角不等式
在这里插入图片描述
其中 第一个for循环的次数是有实际意义的,循环k次,表示最短路径最多经过不超过k条边到达目标点

在这里插入图片描述

例子+题解

在这里插入图片描述
输出案例:3

在这里插入图片描述
数据分析:
backup数组是用来备份dist数组的
结构体用来存放某两个点以及两个点之间的距离
并用该结构体类型创建边数组

对于bellman-ford算法
首先初始化dist数组
之后因为题目要求最多不超过k条边,所以循环k次
在k次循环的每次循环时,首先备份dist到backup数组
然后对于m条边,有m次循环,因为结构体来存放边,每个边是一个结构体元素,所以有几个边,就循环几次
之后利用结构体数组拿到每个边的数据,利用备份的a来更新dist[b]
最后如果n点(具体哪个点看题目要求)的dist>0x3f3f3f/2(记住就好),那么就表示没有最短路径
最后返回dist[n]
在这里插入图片描述

对于为什么要备份,如下:
在这里插入图片描述
因为有k条边的限制,所以,不能向之前那样,一个接着一个更新,这样的话,就会无视k条边的限制,直接找到没有限制的最短路径
在这里插入图片描述
利用备份的数据进行更新,每次都是最初版本的数据,都是正无穷,所以,不会发生数据更新,就会被限制到

多源汇最短路

简介

多个起点

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

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

相关文章

AIGC发展史

1 AIGC概况 1.1 AIGC定义 AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能技术生成的内容。它也被认为是继PGC,UGC之后的新型内容生产方式&#xff0c;AI绘画、AI写作等都属于AIGC的具体形式。2022年AIGC发展速度惊人&#xff0c;迭代速度更是呈现指数级发…

Spring boot -- 学习HttpMessageConverter

文章目录 1. Json格式数据获取2. 为什么返回Json格式的数据2.1 注解SpringBootAppliaction2.1.1 SpringBootConfiguration2.1.2 ComponentScan2.1.3 EnableAutoConfiguration2.1.3.1 HttpMessageConvertersAutoConfiguration2.1.3.2 WebMvcAutoConfiguration 2.2 注解RestContr…

上下拉电阻会增强驱动能力吗?

最近看到一个关于上下拉电阻的问题&#xff0c;发现不少人认为上下拉电阻能够增强驱动能力。随后跟几个朋友讨论了一下&#xff0c;大家一致认为不存在上下拉电阻增强驱动能力这回事&#xff0c;因为除了OC输出这类特殊结构外&#xff0c;上下拉电阻就是负载&#xff0c;只会减…

使用 async/await 是必须避免的陷阱

使用 async/await 是必须避免的陷阱 如果我们使用过 nodejs&#xff0c;那么我们可能已经在 javaSoript 中使用了异步操作。异步任务是一个独立于 JavaSoript 引擎的主线程执行的操作。从本质上讲&#xff0c;这就是应用程序功能没有阻塞的 UI 的原因。 nodejs 的单线程性质&a…

精准测试:提升测试流程的效率与质量

在软件开发的过程中&#xff0c;测试是确保软件质量的关键步骤之一。然而&#xff0c;传统的测试方法往往依赖于测试人员的经验和直觉&#xff0c;效率和准确性存在一定的局限性。为了解决这一问题&#xff0c;精准测试应运而生。精准测试是一种基于数据驱动的测试方法&#xf…

机器学习---使用 EM 算法来进行高斯混合模型的聚类

1. 指定k个高斯分布參数 导包 import math import copy import numpy as np import matplotlib.pyplot as pltisdebug False 全局变量 isdebug可以用来控制是否打印调试信息。当 isdebug 为 True 时&#xff0c;代码中的一些调试信 息将被打印出来&#xff0c;方便进行调试…

执法记录仪、一体化布控球等目前支持的AI智能算法、视频智能分析算法有哪些

一、前端设备实现AI算法 主要是基于安卓的布控球实现&#xff0c;已有的算法包括&#xff1a; 1&#xff09;人脸&#xff1b;2&#xff09;车牌&#xff1b;3&#xff09;是否佩戴安全帽&#xff1b;4&#xff09;是否穿着工装&#xff1b; 可以支持定制开发 烟雾&#xf…

用友NC JiuQiClientReqDispatch反序列化RCE漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC JiuQiClientReqDispatch 接口存在…

File类—递归文件搜索执行脚本文件

文章目录 一、需求分析二、File类2.1 File对象的创建2.2 File判断和获取方法2.3 创建和删除方法2.4 遍历文件夹方法 三、Runtime类—常见api四、递归文件搜索执行脚本文件 一、需求分析 在本篇博客中&#xff0c;我们想通过递归文件的方式&#xff0c;在D:\\判断下搜索QQ.exe这…

老师怎样夸学生

老师夸学生可以从以下几个方面入手&#xff1a; 1. 表扬学生的思维深度和独立思考能力。如果学生在文章中有独特的思考角度和深度的思考&#xff0c;老师可以直接点出来赞扬。 2. 赞美学生的语言表达。如果学生的文章用词精准、文笔流畅&#xff0c;老师可以夸奖学生的语言表达…

【人体解剖学与组织胚胎学】练习一高度相联知识点整理及对应习题

文章目录 [toc]骨性鼻旁窦填空题问答题 关节填空题简答题 胸廓填空题简答题![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/827e7d1db3af42858d8734bb81911fea.jpeg)补充 骨性鼻旁窦 填空题 问答题 关节 填空题 简答题 胸廓 填空题 简答题 补充 第二肋对应胸骨…

ChatGPT哪些行业需要学习?

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

7天快速学习计算机基础必考八股文day01:计算机网络

day01计算机网络目录一览图 TCP、UDP协议分别属于什么层——OSI七层模型详解请简述HTTP1.0、1.1、2.0的主要区别——HTTP版本详解请简述常见HTTP状态码及含义——HTTP报文详解请简述对称加密、非对称加密的异同——安全传输的基础请简述HTTPS加密认证的过程——TLS技术详解请简…

9.Unity搭建HTTP服务器

搭建HTTP服务器的几种方式 //1.使用别人做好的HTTP服务器软件&#xff0c;一般作为资源服务器时使用该方式&#xff08;学习阶段建议使用&#xff09; //2.自己编写HTTP服务器应用程序&#xff0c;一般作为Web服务器 或者 短链接游戏服务器时 使用该方式 使用别人做好的HTTP服…

JDK8升级11常见问题

JDK8升级11常见问题 1. 使用rt.jar/jce.jar情况 原代码&#xff1a; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><targe…

P=NP?

背景&#xff1a;   2000年5月24日&#xff0c;新罕布什尔州的克莱数学研究所列出了数学和计算机科学中七个未解决的问题。然而&#xff0c;直到今天&#xff0c;这些问题中只有一个被解决了&#xff0c;那就是庞加莱猜想&#xff08;Poincar Conjecture&#xff09;——被俄…

Linux下的java环境搭建

1&#xff0c;安装jdk 上传linux使用的jdk到/opt目录下 解压tar -zxvf文件 配置环境变量 vim /etc/profile 在文件中添加 export JAVA_HOME/opt/jdk8 export PATH$PATH:$JAVA_HOME/bin 使文件生效 source /etc/profile 2,安装tomcat 将tomcat包解压&#xff0c;进入bi…

Vue 官方周报 #122 - 如何使用Head插件

Hi &#x1f44b; 本周的问题中&#xff0c;您将学习在Vue中如何使用Head插件。 unhead是一个与框架无关的文档头管理器&#xff0c;您可以使用它来管理页面元数据&#xff0c;如 Vue应用程序中的标题。 它用于Nuxt核心&#xff0c;是UnJS生态系统的一部分。 安装 首先&…

rancher harvester deploy demo 【部署 harvester v1.2.1】

简介 Harvester 是一个现代的、开放的、可互操作的、基于Kubernetes的超融合基础设施(HCI)解决方案。它是一种开源替代方案&#xff0c;专为寻求云原生HCI解决方案的运营商而设计。Harvester运行在裸机服务器上&#xff0c;提供集成的虚拟化和分布式存储功能。除了传统的虚拟机…

Git and solve the problem denied to xx

创建仓库 配置Git git config user.name git config user.email git config MINGW64 /e/GithubCode $ git config --global user.name "name"MINGW64 /e/GithubCode $ git config --global user.email "mailxx.com" 生产ssh ssh-keygen -t rsa -C “xx…