数据结构之最短路径

news2024/12/23 17:47:50

数据结构之最短路径

  • 1、单源点最短路径
  • 2、每对顶点间的最短路径

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  图是比树结构更复杂的一种数据结构。在线性结构中,除首结点没有前驱、末尾结点没有后继外,一个结点只有唯一的一个直接前驱和唯一的一个直接后继。在树结构中,除根结点没有前驱结点外,其余的每个结点只有唯一的一个前驱(双亲) 结点和多个后继 (子树) 结点。而在图中,任意两个结点之间都可能有直接的关系,所以图中一个结点的前驱结点和后继结点的数目是没有限制的。

1、单源点最短路径

  所谓单源点最短路径,是指给定带权有向图 G 和源点 v0,求从 v0 到 G 中其余各顶点的最短路径。迪杰斯特拉 (Dijkstra) 提出了按路径长度递增的次序产生最短路径的算法,其思想是:把网中所有的顶点分成两个集合 S 和 T,S 集合的初态只包含顶点 v0,T集合的初态为网中除 v0 之外的所有顶点。凡以 v0 为源点,已经确定了最短路径的终点并入 S集合中,顶点集合 T则是尚未确定最短路径的顶点的集合。按各顶点与 v0 间最短路径长度递增的次序,逐个把 T集合中的顶点加入到S集合中去,使得 v0 从到 S集合中各顶点的路径长度始终不大于从 v0 到T集合中各顶点的路径长度。
  对于下图 所示的有向网,用迪杰斯特拉算法求解顶点 v0 到达其余顶点的最短路径的过程如表 3-1 所示。
在这里插入图片描述

终点12345
v1
v2 100 ( v 0 , v 2 ) 100\\(v_0, v_2) 100(v0,v2) 100 ( v 0 , v 2 ) 100\\(v_0, v_2) 100(v0,v2) 90 ( v 0 , v 3 , v 2 ) 90\\(v_0,v_3,v_2) 90(v0,v3,v2) 60 ( v 0 , v 3 , v 4 , v 2 ) 60\\(v_0,v_3,v_4,v_2) 60(v0,v3,v4,v2)
v3 30 ( v 0 , v 3 ) 30\\(v_0,v_3) 30(v0,v3) 30 ( v 0 , v 3 ) 30\\(v_0,v_3) 30(v0,v3)
v4 60 ( v 0 , v 5 , v 4 ) 60\\(v_0,v_5,v_4) 60(v0,v5,v4) 50 ( v 0 , v 3 , v 4 ) 50\\(v_0,v_3,v_4) 50(v0,v3,v4)
v5 10 ( v 0 , v 5 ) 10\\(v_0,v_5) 10(v0,v5)
说明在从v0到v1、v2、v3、v4、v5的路径中,(v0,v5)最短,则将顶点 v5加入S集合,并且更新 v0到v4的路径在从v0到v1、v2、v3、v4的路径中,(v0,v3)最短,则将顶点 v3加入S集合,并且更新 v0到v2、 v0到v4的路径在从v0的到v1、v2、v4的路径中,(v0,v3,v4)最短,则将顶点 v4加入S集合,并且更新 v0到v2的路径在从v0的到v1、v2的路径中,(v0,v3,v4,v2)最短,则将顶点 v2加入S集合v0的到v1无路径
集合S{v0, v5}{v0, v5, v3}{v0, v5, v3, v4}{v0, v5, v3, v4, v2}

  为了能方便地求出从 v0 到 T 集合中各顶点最短路径的递增次序,算法实现时引入一个辅助向量 dist。它的分量 dist[i] 表示当前求出的从 v0 到终点 vi 的最短路径长度。这个路径长度并不一定是最后的最短路径长度。它的初始状态为: 若从 v0 到 vi 有弧,则 dist[i]为弧上的权值;否则,置 dist[i] 为 ∞。显然,长度为 dist[u]= min{dist[i] | vi∈ V(G)} 的路径就是从 v0 出发的长度最短的一条最短路径。此路径为(v0,u),这时顶点 u 应从集合T中删除,将其并入集合 S。
  设图采用邻接矩阵 arcs 存储,那么每次选出一个顶点 u 并使之并入集合 S后,就根据情况修改T集合中各顶点的路径长度 dist。对于T集合中的某一个顶点 i 来说,其更短路径可能为(v0, …,vu, vi)。也就是说,若dist[u]+arcs[u][i]<dist[i],则修改 dist[i],使 dist[i]= dist[u]+arcs[u][i] 。
  对 T集合中各顶点的 dist 进行修改后,再从中挑选出一个路径长度最小的顶点,从T集合中删除之并将其并入S集合。依此类推,就能求出源点到其余各顶点的最短路径长度。

2、每对顶点间的最短路径

  若每次以一个顶点为源点,重复执行迪杰斯特拉算法 n 次,便可求得网中每一对顶点之间的最短路径。下面介绍弗洛伊德 (Floyd) 提出的求最短路径的算法,该算法在形式上要更简单一些。
  弗洛伊德算法思想是:假设图采用邻接矩阵的方式存储,需要求从顶点 vi 到 vj 的最短路径。arcs[i][j] 表示弧 (vi,vj)的权值,若此弧不存在,则权值为区别于有效权值的一个数。如果存在 vi 到 vj 的弧,则从 vi 到 vj 存在一条长度为 arcs[i][j] 的路径,该路径不一定是最短路径,尚需进行n次试探。首先考虑路径 (vi,v0,vj)是否存在 (即判别路径 (vi,v0) 和 (v0,vj)是否存在),若存在,则比较 (vi,vj)与(vi,v0,vj)的路径长度,取较短者为从 vi 到 vj 且中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点 vi,也就是说,如果 (vi,···,v1)和(v1,···,vj) 分别是当前找到的中间顶点的序号不大于 0的 vi 到 v1 以及 v1到vj 的最短路径,那么 (vi,···v1···,vj)就有可能是从 vi 到 vj 且中间顶点的序号不大于1 的最短路径。将它与已经得到的从 vi 到 vj 的中间顶点的序号不大于 0 的最短路径相比较,从中选出中间顶点的序号不大于 1 的最短路径之后,再增加一个顶点 v2 继续进行试探,依此类推。一般情况下,若(vi,···,vk)和(vk,···,vj) 分别是从vi 到vk和 vk 到 vj 的中间顶点的序号不大于k-1 的最短路径,则将(vi,···,vk,···,vj)与已经得到的从 vi 到 vj 的中间顶点的序号不大于 k-1 的最短路径相比较,长度较短者便是从 vi 到 vj 的中间顶点的序号不大于k的最短路径。这样,经过 n 次试探后,最后求得的必是从 vi 到 vj 的最短路径。按此方法,可以同时求得各对顶点间的最短路径。

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

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

相关文章

【Python笔记-设计模式】建造者模式

一、说明 又称生成器&#xff0c;是一种创建型设计模式&#xff0c;使其能够分步骤创建复杂对象。允许使用相同的创建代码生成不同类型和形式的对象。 (一) 解决问题 对象的创建问题&#xff1a;当一个对象的构建过程复杂&#xff0c;且部分构建过程相互独立时&#xff0c;可…

idea 创建 spring boot

1.创建步骤 2. 编码添加 2.1 这是自动生成的启动函数 package com.example.comxjctest4;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class Application {publi…

STM32控制DHT11温湿度传感器模块获取温湿度数据

时间记录&#xff1a;2024/1/29 一、DHT11引脚介绍 &#xff08;1&#xff09;VCC&#xff1a;电源引脚&#xff0c;3.3-5.5V &#xff08;2&#xff09;DATA&#xff1a;数据输入输出引脚 &#xff08;3&#xff09;NC&#xff1a;保留引脚&#xff0c;悬空即可 &#xff08;…

postgresql慢查询排查和复现

postgresql慢查询排查和复现 一. 介绍一张表&#xff1a;pg_stat_activity pg_stat_activity 是 PostgreSQL 中一个非常有用的系统视图&#xff0c;提供了有关当前数据库连接和活动查询的信息。通过查询这个视图&#xff0c;你可以获取有关正在执行的查询、连接的用户、进程 …

VitePress-04-文档中的表情符号的使用

说明 vitepress 的文档中是支持使用表情符号的&#xff0c;像 &#x1f602; 等常用的表情都是支持的。 本文就来介绍它的使用方式。 使用语法 语法 &#xff1a; :表情名称: 例如 &#xff1a; :joy: &#x1f602; 使用案例代码 # 体会【表情】的基本使用 > hello world …

设计模式——2_0 职责链(Chain of Responsibility)

楼下一个男人并得要死&#xff0c;那家隔壁的一家唱着留声机&#xff0c;对面是弄孩子。楼上有两人狂笑&#xff1b;还有打牌声&#xff0c;河中的船上有女人哭她死去的母亲。人类的悲欢并不相通&#xff0c;我只觉得他们吵闹 ——鲁迅 定义 使多个对象都有机会处理请求&#…

VScode注释快捷键,RStudio注释快捷键, Texmaker注释快捷键

VScode&#xff1a;一款界面简单的代码编辑器&#xff1b;RStudio: R语言的IDE&#xff0c;包含代码编辑器&#xff0c;运行&#xff0c;绘图窗口等&#xff1b;Texmaker&#xff1a;Latex编译器&#xff08;编辑编译&#xff09;&#xff0c;界面简单&#xff0c;个人认为比Te…

sqli-labs第一关

1.判断是否存在注入&#xff0c;注入是字符型还是数字型? ?id1 and 11 ?id1 and 12 因为输入and 11与and 12 回显正常&#xff0c;所以该地方不是数字型。 ?id1 ?id1-- 输入单引号后报错&#xff0c;在单引号后添加--恢复正常&#xff0c;说明存在字符注入 2.猜解SQL查…

安全 输入输出类 XSS CSRF

输入输出类&#xff08;留言板&#xff09; 执行JS语句&#xff08;XSS漏洞&#xff09; XSS漏洞&#xff08;有输入框就可能-见框就X&#xff09; 反射型 语句植入并执行 存储型 语句植入到数据库&#xff0c;调用数据库就执行 UA头判断访问者浏览器信息 可以XSS php…

亚组分析、P交互、P趋势是什么?如何计算呢?

亚组分析、P交互、P趋势是什么&#xff1f;如何计算呢&#xff1f; &#xff08;1&#xff09;亚组分析如何计算&#xff1f; &#xff08;2&#xff09;P交互作用的计算方法&#xff1f; &#xff08;3&#xff09;P趋势如何计算&#xff1f; &#xff08;1&#xff09;亚组…

SNP干货分享:SAP数据脱敏的具体实施步骤

随着信息技术的飞速发展&#xff0c;大数据时代的到来使得数据成为国家经济、企业竞争力和个人隐私的重要载体。在这种背景下&#xff0c;数据安全问题日益凸显&#xff0c;各国政府纷纷出台相关法规以保护数据安全。我国也不断完善数据安全法规体系&#xff0c;以确保国家利益…

十分钟发布自己的NFT

概述 本文将以一个例子来说明如何在opensea快速发布自己的NFT智能合约&#xff08;ERC721&#xff09;。本着DRY&#xff08;Dont Repeat Yourself&#xff09;原则&#xff0c;我们需要站在巨人的肩膀上来搭建自己的应用&#xff0c;使用经过社区审计和实践检验的代码可以有效…

python统计分析——样本方差的分布

参考资料&#xff1a;用python动手学统计学 1、导入库 import numpy as np import pandas as pd import scipy as sp from scipy import statsfrom matplotlib import pyplot as plt import seaborn as sns 2、数据准备 建立一个平均数为4&#xff0c;标准差为0.8的正态分布…

腾讯云4核16G服务器价格,用于幻兽帕鲁Palworld专用

腾讯云幻兽帕鲁服务器4核16G、8核32G和16核64G配置可选&#xff0c;4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G35M配置580元年1个月、1740元3个月、6960元一年&#xff0c;腾讯云百科txybk.com分享腾讯云幻兽帕鲁…

自然语言处理 TF-IDF

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Java强训day10(选择题编程题)

选择题 public class Test01 {public static void main(String[] args) {try{int i 100 / 0;System.out.print(i);}catch(Exception e){System.out.print(1);throw new RuntimeException();}finally{System.out.print(2);}System.out.print(3);} }编程题 题目1 import jav…

重构改善既有代码的设计-学习(六):处理继承关系

1、函数上移&#xff08;Pull Up Method&#xff09; 无论何时&#xff0c;只要系统内出现重复&#xff0c;你就会面临“修改其中一个却未能修改另一个”的风险。通常&#xff0c;找出重复也有一定的难度。 所以&#xff0c;某个函数在各个子类中的函数体都相同&#xff08;它们…

leetcode hot100跳跃游戏Ⅱ

本题和上一题还是有不一样的地方&#xff0c;这个题中&#xff0c;我们需要记录我们跳跃的步数并尽可能的满足最小的跳跃步数到达终点。 那么我们还是采用覆盖范围的概念&#xff0c;但是我们需要两个&#xff0c;一个是在当前位置的覆盖范围&#xff0c;另一个是下一步的覆盖…

Linux的 .bashrc 有什么作用?

一、.bashrc 是什么? 有什么用&#xff1f; .bashrc是一个存储在你的home目录下的隐藏文件&#xff0c;它用来配置和自定义你的终端环境和行为。 每次你启动一个新的终端时&#xff0c;.bashrc文件就会被执行&#xff0c;加载你设置的环境变量&#xff0c;别名&#xff0c;函数…

深度学习-自注意力机制

文字编码 one-hot编码&#xff0c;让模型自己去学习怎么进行编码 常见的输出 1.每个词都有一个输出值 2.每个句子输出一个值&#xff0c;情感分类 3.输入与输出长度不对应&#xff0c;翻译任务&#xff0c;生成任务。 RNN最早的语言处理 RNN解决的是模型去考虑前面的输入…