数据结构:图的最短路径

一、最短路径的基本概念

  • 无权图:路径包含的边的条数。
  • 带权图:路径包含的各边权值之和。
  • 长度最小的路径称为最短路径,最短路径的长度也称为最短距离。

二、无权图单源最短路径

        无权图单源最短路径使用BFS求出,时间复杂度为O(n+e)。该算法可以求出单源到所有顶点的最短路,并且可以通过静态链表的方式存储各顶点的最短路径信息。

        在BFS访问的过程中,当访问某个顶点时,就确定了该点与源点的最短距离。

#include<bits/stdc++.h>
using namespace std;
#define n 10
struct Edge{int VerName;Edge * next;
};
struct Vertex{int VerName;Edge * edge=nullptr;
};
vector<int> path(n);
Vertex Head[n];
vector<int> dist(n,0x3f3f3f3f);
void BFS(Vertex * Head,int s){dist[s]=0;path[s]=-1;queue<int> q;q.push(s);while(!q.empty()) {int pre=q.front();q.pop();for(Edge * edge=Head[pre].edge;edge!=nullptr;edge=edge->next) {int k=edge->VerName;if(dist[k]==0x3f3f3f3f) {//未被访问过dist[k]=dist[pre]+1;q.push(k);path[k]=pre;//记录该路径的前驱}}}return;
}
int main(void) {return 0;}

三、Dijkstra算法(正权图单源)

        虽然在关键路径中,我们使用过拓扑排序+动态规划求最长路径,时间复杂度是O(n+e)。但是这是在图存在拓扑排序时才能使用的。一般情况下的图更加复杂。一般情况下的正权图,可以使用迪杰斯特拉算法求出最短路径。迪杰斯特拉不能求带有负权图的最短路径。

        Dijkstra算法可以求出单源点到所有点的最短路径。该算法使用优先队列可以优化成O(nlogn)。

1.1、算法的基本步骤

①将图中的所有顶点分成两个集合,一个是集合S,一个是集合V-S,S中的顶点表示已经确定最短路的顶点,V-S中表示尚未确定最短路的顶点。

②在初始时S为空集,将源点压入优先队列,执行③

③在V-S中选择离源点最近的顶点(包括源点自身),将该顶点放入S,表示该顶点已经求出最短路径,执行④

④遍历该顶点的所有边,更新其他顶点的最短路径,重复③,直至所有顶点都已经求出最短路径。

        该算法实现时遍历所有顶点一次,遍历所有边一次,对于每一个顶点的所有边访问的顶点只要不在S中都压入优先队列中(延迟出栈,不修改队列中的元素,也可以直接自定义实现修改队列中的元素),可能重复压栈,因此时间复杂度为O(nloge+e)。由于e<=n^2 loge<=2logn,取最大阶,因此时间复杂度为O(nlogn)。

1.2、算法的实现

        这里采用STL的优先队列的方法,优先队列采用延迟出栈,出栈的顶点若不在S中,则选择它,如果出栈的顶点在S中,则忽略该顶点,直至找到真正不在S中的顶点,多个副本在优先队列中是没问题的,因为多个副本距离最短的优先出队。出队防止队列为空!

int n=100;
vector<int> dist(n,0x3f3f3f3f);
vector<int> path(n);
void Dijkstra(Vertex * Head,int s){unordered_set<int> S_set;//集合Spriority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;//默认是大根堆,定义小根堆! {dist,k} 直接使用pair的比对函数,先比较dist,dist小者优先q.push({0,s});dist[s]=0;path[s]=-1;while(S_set.size()!=n){//若非全部入S//如果提前空了,则说明s并不能到达所有顶点while(!q.empty()&&S_set.find(q.top().second)!=S_set.end()) q.pop();//不能用单纯有没有更新过判断,因为它可能被更新过但不是最小的if(q.empty()) break;int pre=q.top().second;q.pop();S_set.insert(pre);for(Edge * edge=Head[pre].edge;edge!=nullptr;edge=edge->next) {int k=edge->VerName;if(S_set.find(k)==S_set.end()){//在S中不需要更新了dist[k]=min(dist[k],dist[pre]+edge->cost);if(dist[k]==dist[pre]+edge->cost){path[k]=pre;//更新前驱q.push({dist[k],k});//只有被更新了才导入,没被更新不是最优解就不导了}}}}return;
}

四、A*算法

五、Floyd算法

六、Bellman-Ford算法

七、SPAF算法

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

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

相关文章

【MySQL】图形化界面工具DataGrip安装&配置&使用

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

NVIDIA Chat with RTX教程使用以及CUDA和CUDNN

基本环境安装&#xff1a;CUDA12.1CUDNNcudnn-windows-x86_64-8.9.7.29_cuda12-archive 1、CUDA下载 CUDA官方安装教程: https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html CUDA Toolkit的下载: CUDA Toolkit 12.1 Downloads | NVIDIA Dev…

MR混合现实情景实训教学系统在商务外语课堂上的教学应用

商务外语课程通常注重实践性和情景化&#xff0c;要求学生能够在实际的商务环境中运用外语进行交流和沟通。MR混合现实情景实训教学系统可以提供一种全新的教学方式&#xff0c;使学生能够身临其境地体验商务场景&#xff0c;提高他们的外语应用能力和实际操作能力。 1. 模拟真…

vue3封装对话框el-dialog组件

实现逻辑&#xff1a; 1、引入对话框组件&#xff1b; 2、对话框组件中定义一个方法&#xff0c;通过defineExpose({})暴漏出去&#xff1b; 3、组件使用&#xff0c;并用ref绑定&#xff1b; 4、点新增和编辑的时候&#xff0c;通过ref调用对话框暴漏出来的方法&#xff0c;并…

【数据可视化】Echarts中的其它图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型

塑料工厂5G智能制造数字孪生可视化平台&#xff0c;推进塑料行业数字化转型。塑料制造行业作为重要的工业领域&#xff0c;亟需借助这一平台实现产业升级与转型&#xff0c;以适应市场的变化和提高生产效率。传统的塑料制造过程往往存在生产效率低下、资源浪费、环境污染等问题…

二维数组_肿瘤面积

任务描述 在一个正方形的灰度图片上&#xff0c;肿瘤是一块矩形的区域&#xff0c;肿瘤的边缘所在的像素点在图片中用0表示。其它肿瘤内和肿瘤外的点都用255表示。现在要求你编写一个程序&#xff0c;计算肿瘤内部的像素点的个数&#xff08;不包括肿瘤边缘上的点&#xff09;…

突发!OpenAI服务异常!!!

2024/3/20傍晚7点&#xff0c;笔者的朋友在使用OpenAI时&#xff0c;页面提示服务异常&#xff0c;由此引发了我的深思&#xff1a;人工智能的脆弱性与未来的挑战 2024年3月20日&#xff0c;傍晚7点&#xff0c;一个普通的周二&#xff0c;我的朋友在尝试使用OpenAI时&#xf…

人脸识别AI视觉算法---豌豆云

人脸识别AI算法是一种基于计算机视觉和深度学习技术的系统&#xff0c;用于自动识别和验证人脸。 这些算法在多种领域有着广泛的应用&#xff0c;包括安全认证、身份验证、监控、社交媒体、医疗保健和零售等。 以下是有关人脸识别AI算法的技术背景和应用场景的介绍&#xff1…

方案开发行业迎来新数字化转型新浪潮

着科技的不断发展和市场需求的日益增长&#xff0c;方案开发行业正迎来新一轮的创新浪潮。数字化转型已成为该行业的关键词&#xff0c;各大企业纷纷加大研发投入&#xff0c;以期在激烈的市场竞争中脱颖而出。 近年来&#xff0c;方案开发行业在范围内取得了显著的发展。根据…

从初学者到专家:Java枚举的完整指南

1.枚举的概念 在Java中&#xff0c;枚举是一种特殊的数据类型&#xff0c;用于定义一组有限的命名常量。枚举提供了一种更直观、更可读的方式来表示一组相关的常量&#xff0c;并且可以为这些常量绑定其他数据或行为。 背景&#xff1a;枚举是在JDK1.5以后引入的。 主要用途…

【JavaScript】JavaScript 程序流程控制 ② ( 循环流程控制 | 循环要素 - 循环体 / 循环终止条件 | for 循环语法结构 )

文章目录 一、JavaScript 程序流程控制 - 循环流程控制1、循环流程控制2、循环要素 - 循环体 / 循环终止条件3、for 循环语法结构 - 循环控制变量 / 循环终止条件 / 操作表达式4、for 循环 完整代码示例 一、JavaScript 程序流程控制 - 循环流程控制 1、循环流程控制 在 程序开…

杰发科技AC7801——Keil编译的Hex大小如何计算

编译结果是Keil里面前三个数据的总和&#xff1a; 即CodeRoDataRWData的总和。 通过ATCLinkTool工具查看内存&#xff0c;发现最后一个字节正好是5328 注意读内存数据时候需要强转成32位&#xff0c;加1000的 增加1024的地址只需要加256即可

关于paper中的一些硬件知识

一. OS中的event Information in event traces from software systems can help developers with performance analysis, debugging and troubleshooting 1.事件的概念 已知软件系统中的event能够帮助开发者对系统进行性能分析、调试以及定位&#xff0c;那我们应该仔细考虑…

Python教程:一文了解Python requests模块

Python 中的 requests 模块是一个简洁而强大的 HTTP 库&#xff0c;用于向 Web 服务器发送 HTTP 请求和处理响应。它让开发者能够更轻松地与网络资源进行交互&#xff0c;包括发送 GET、POST、PUT、DELETE 等类型的请求&#xff0c;并处理返回的数据。 以下是 Python requests…

突破图神经网络技术瓶颈!新阶段3大创新方向大幅提高模型性能

针对传统的图神经网络在处理非结构化数据、捕捉高阶关系等方面的局限性&#xff0c;研究者们提出了众多优化方案。 这其中&#xff0c;超图神经网络、几何图神经网络、动态图神经网络作为GNN发展的前沿方向&#xff0c;不仅提供了更加丰富和灵活的方法来处理各种复杂的图数据&…

什么是物联网嵌入式硬件?有哪些特点和优势?

【前言】本篇为物联网硬件系列学习笔记&#xff0c;分享学习&#xff0c;欢迎评论区交流~ 物联网嵌入式硬件是专为物联网应用而设计的硬件设备。这些设备通常小型化、低功耗&#xff0c;集成了处理器、存储器、传感器、通信模块等功能&#xff0c;使其能够连接并与其他设备进行…

2403d,d的com哪里错了

原文 感谢任意见解.细节: >dmd --version DMD64 D Compiler v2.107.0参考: ComObject类 IUnknown接口 我只使用了ComObject类和隐式继承了IUnknown接口,用用ImportC编译并包含以下内容的comheaders.c编写了一些COM测试代码. #define WINVER 0x0A00 #define _WIN32_WINNT…

【Linux】Linux安装软件---软件包管理器 yum

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.Linux中安装软件 1.1 源代码安装 1.2 rpm包安装 1.3 yum安装 1.3.1 举例 1.3.2 图示yum下载安装 2.Linux系统的生态 如何选…

第9关:请将(S2,J6,P4,200)插入供应情况关系表SPJ

任务描述 请将(S2&#xff0c;J6&#xff0c;P4&#xff0c;200)插入供应情况关系表SPJ 相关知识 供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成&#xff0c;标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图&…