当前位置: 首页 > news >正文

C++ Dijkstra 最短路径求解算法的两种实现方案

迪杰斯特拉算法(Diikstra) 是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。

核心思想,搜索到某一个顶点后,更新与其相邻顶点的权重。顶点权重的数据含义表示从起始点到此点的最短路径长度(也就是经过的所有边的权重之和)。DJ 算法搜索时,每次选择的下一个顶点是所有权重值最小的顶点,其思想是保证每一次选择的顶点和当前顶点权重都是最短的。所以,DJ是基于贪心思想。

矩阵存储

常规时间复杂度:O(n),可以使用堆优化优先队列,时间复杂度降低到O(logN)。缺点是对于稀疏图而言空间浪费严重。

#include <bits/stdc++.h>
using namespace std;//矩阵,存储图
int graph[100][100];
//顶点、边数
int v,e;
//优先队列,使用数组
int pri[100];
//存储起点到其它顶点之间的最短距离
int dis[100];
//设置无穷大常量
int const INF =INT_MAX;/*
*初始化函数
*/
void init()
{//初始化图中顶点之间的关系for(int i=1; i<=v; i++){for(int j=1; j<=v; j++){if( i==j ){//自己和自己的关系(权重)为 0graph[i][j]=0;}else{//任意两点间的距离为无穷大graph[i][j]=INF;}}}//交互式确定图中顶点之间的关系int f,t,w;for( int i=1; i<=e; i++ ){cin>>f>>t>>w;graph[f][t]=w;}//初始设编号为 1 的顶点为起始点,根据顶点的关系初始化起点到其它顶点之间的距离for(int i=1; i<=v; i++){dis[i]=graph[1][i];}//初始化优先队列(也称为候选队列)for(int i=1; i<=v; i++ ){if(i==1){//起始顶点默认为已经候选pri[i]=1;continue;}//其它顶点都可候选pri[i]=0;}}/*
*
*Dijkstra算法
*/
void dijkstra()
{for(int i=1; i<=v; i++){//从候选队列中选择一个顶点,要求到起始顶点的距离为最近的int u=-1;int mi=INF;for( int j=1; j<=v; j++ ){if(pri[j]==0 && dis[j]<mi){mi=dis[j];u=j;}}if(u!=-1)//找到后设置为已经候选pri[u]=1;else //找不到就结束break;//查找与此候选顶点相邻的顶点,且更新邻接点与起点之间的距离//相当于在此顶点基础上向后延长for( int j=1; j<=v; j++ ){if(  graph[u][j]!=INF ){//找到相邻顶点if(dis[j]>dis[u]+graph[u][j]  ){//更新dis[j]=dis[u]+graph[u][j];}}}}}/*
*
*显示最后的结果
*/
void show()
{for(int i=1; i<=v; i++){cout<<dis[i]<<"\t";}
}int main()
{cin>>v>>e;init();dijkstra();show();return 0;
}
//测试用例
6  9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
//输出
0  1  8  4  13  17

邻接表

整个时间复杂度可以优化到O(M+N)logN。在最坏的情况下M(边数)就是N(顶点数),这样的话(M+M)logN要比N还要大。但是大多数情况下并不会有那么多边,因此(M+M)logN要比N小很多。

#include <bits/stdc++.h>using namespace std;
/*
* 顶点类型
*/
struct Ver
{//顶点编号int vid=0;//第一个邻接点int head=0;//起点到此顶点的距离(顶点权重),初始为 0 或者无穷大int dis=0;//重载函数bool operator<( const Ver & ver ) const{return this->dis<ver.dis;}void desc(){cout<<vid<<" "<<dis<<endl;}
};/*
* 边
*/
struct Edge
{//邻接点int to;//下一个int next=0;//权重int weight;
};class Graph
{
private:const int INF=INT_MAX;//存储所有顶点Ver vers[100];//存储所有边Edge edges[100];//顶点数,边数int v,e;//起点到其它顶点之间的最短距离int dis[100];//优先队列priority_queue<Ver> proQue;public:Graph( int v,int e ){this->v=v;this->e=e;init();}void init(){for(int i=1;i<=v;i++){//重置顶点信息vers[i].vid=i;vers[i].dis=INF;vers[i].head=0;}int f,t,w;for(int i=1; i<=e; i++){cin>>f>>t>>w;//设置边的信息edges[i].to=t;edges[i].weight=w;//头部插入edges[i].next=vers[f].head;vers[f].head=i;}for(int i=1; i<=v; i++){dis[i]=vers[i].dis;}}void dijkstra(int start){//初始化优先队列,起点到起点的距离为 0vers[start].dis=0;dis[start]=0;proQue.push(vers[start]);while( !proQue.empty() ){//出队列Ver ver=proQue.top();ver.desc();proQue.pop();//找到邻接顶点 i 是边集合索引号for( int i=ver.head; i!=0; i=edges[i].next){int v=edges[i].to;//更新距离if( vers[ v ].dis > ver.dis + edges[i].weight ){vers[ v ].dis = ver.dis+edges[i].weight;dis[ v ]= vers[ v ].dis;//入队列proQue.push( vers[v] );}}}}void show(){for(int i=1; i<=v; i++){cout<<dis[i]<<"\t";}}};int main()
{int v,e;cin>>v>>e;Graph graph(v,e);int s;cin>>s;graph.dijkstra(s);graph.show();return 0;
}

相关文章:

C++ Dijkstra 最短路径求解算法的两种实现方案

迪杰斯特拉算法(Diikstra) 是由荷兰计算机科学家狄克斯特拉于1959 年提出的&#xff0c;因此又叫狄克斯特拉算法。 核心思想&#xff0c;搜索到某一个顶点后&#xff0c;更新与其相邻顶点的权重。顶点权重的数据含义表示从起始点到此点的最短路径长度&#xff08;也就是经过的…...

因存在色情内容,夸克被罚50万元

媒体经济的繁荣、自媒体、直播等各种形式的信息传播疯狂发展&#xff0c;但是各种形式的信息资源大规模生产时&#xff0c;“色情”&#xff0c;“暴力”的图像和视频不可控的滋生&#xff0c;特别是某些 APP 或浏览器。一旦打开&#xff0c;满屏都是“哥哥&#xff0c;快来啊”…...

汽车EDI:福特Ford EDI项目案例

项目背景 福特&#xff08;Ford&#xff09;是世界著名的汽车品牌&#xff0c;为美国福特汽车公司&#xff08;Ford Motor Company&#xff09;旗下的众多品牌之一。此前的文章福特FORD EDI需求分析中&#xff0c;我们已经了解了福特Ford EDI 的大致需求&#xff0c;本文将会介…...

正则表达式的使用实例

正则表达式的使用实例 1- 表示2- 实例 1- 表示 1, [:digit:] 表示0-9全部十个数字 //等价于 0123456789&#xff0c; 而不等价于[0123456789] 2, [[:digit:]] 表示任意一个数字 \{m,n\} 表示其前面的字符出现最少m次&#xff0c;最多n次的情况 \{3,\} 其前面的字符出…...

STM智能小车——OLED实现测速小车

目录 1. 测速模块 2. 测试原理和单位换算 3. 定时器和中断实现测速开发和调试代码 4. 小车速度显示在OLED屏 1. 测速模块 用途&#xff1a;广泛用于电机转速检测&#xff0c;脉冲计数,位置限位等。有遮挡&#xff0c;输出高电平&#xff1b;无遮挡&#xff0c;输出低电平接线…...

pod基本概念

目录 pod基本概念 pause容器 Pod分类&#xff1a; Pod容器的分类 1、基础容器&#xff08;infrastructure container&#xff09; 2、初始化容器&#xff08;initcontainers&#xff09; 3、应用容器&#xff08;Maincontainer&#xff09; 镜像拉取策略&#xff08;im…...

SQL Server 中定时调度调用存储过程

要在SQL中定时调度调用存储过程&#xff0c;你可以使用SQL Server代理&#xff08;如果你正在使用SQL Server数据库&#xff09;。下面是一些步骤来配置SQL Server代理以定时调度调用存储过程&#xff1a; 打开SQL Server Management Studio (SSMS) 并连接到你的SQL Server实例…...

SpringCloud(三) Ribbon负载均衡

SpringCloud(二) Eureka注册中心的使用-CSDN博客 在SpringCloud(二)中学习了如何通过Eureka实现服务的注册和发送,从而通过RestTemplate实现不同微服务之间的调用,加上LoadBalance注解之后实现负载均衡,那负载均衡的原理是什么呢? 目录 一, 负载均衡 1.1 负载均衡原理 1.2 源…...

vue2:路由前置守卫无法获取到this.$store.state.xxx

在获取到vuex的数据时候&#xff0c;想在router目录下的index.js文件去获取到vuex仓库中声明的全局变量&#xff0c;但是通过this.$store.stote.xxx去获取的时候&#xff0c;报错提示&#xff1a;$store未定义 一、store/index.js const store new Vuex.Store({state: {// 属…...

Unity的碰撞检测(五)

温馨提示&#xff1a;本文基于前一篇“Unity的碰撞检测(四)​​​​​​​”继续探讨两个游戏对象具备刚体的BodyType均为Dynamic&#xff0c;但是Collision Detection属性不同的碰撞检测&#xff0c;阅读本文则默认已阅读前文。 &#xff08;一&#xff09;测试说明 在基于两…...

Flutter笔记:Flutter的应用生命周期状态(lifecycleState)管理

Flutter笔记 Flutter的应用生命周期状态&#xff08;lifecycleState&#xff09;管理 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/…...

代碼隨想錄算法訓練營|第五十四天|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组。刷题心得(c++)

讀題 300.最长递增子序列 看完代码随想录之后的想法 思想上很簡單&#xff0c;dp[i]表示i之前的包括i的numbers[i]節尾的最長上升子序列的長度 並且透過兩層迴圈&#xff0c;一層遍歷全部&#xff0c;一層遍歷到i&#xff0c;透過比較當前dp[i]還是dp[j] 1哪個比較大&…...

正点原子嵌入式linux驱动开发——Linux 串口RS232/485/GPS 驱动

串口是很常用的一个外设&#xff0c;在Linux下通常通过串口和其他设备或传感器进行通信&#xff0c;根据 电平的不同&#xff0c;串口分为TTL和RS232。不管是什么样的接口电平&#xff0c;其驱动程序都是一样的&#xff0c;通过外接RS485这样的芯片就可以将串口转换为RS485信号…...

HDFS工作流程和机制

HDFS写数据流程&#xff08;上传文件&#xff09; 核心概念--Pipeline管道 HDFS在上传文件写数据过程中采用的一种传输方式。 线性传输&#xff1a;客户端将数据写入第一个数据节点&#xff0c;第一个数据节点保存数据之后再将快复制到第二个节点&#xff0c;第二节点复制给…...

CMMI/ASPICE认证咨询及工具服务

服务概述 质量专家戴明博士的名言“如果你不能描述做事情的过程&#xff0c;那么你不知道你在做什么”。过程是连接有能力的工程师和先进技术的纽带&#xff0c;因此产品开发过程直接决定了产品的质量和研发的效率。 经纬恒润可结合多体系要求&#xff0c;如IATF16949\ISO26262…...

【NI-DAQmx入门】计数器

1.计数器的作用 NI产品的计数器一般来说兼容TTL信号&#xff0c;定义如下&#xff1a;0-0.8V为逻辑低电平&#xff0c;2~5V为高电平&#xff0c;0.8-2V为高阻态&#xff0c;最大上升下降时间为50ns。 计数器可以感测上升沿&#xff08;从逻辑低到逻辑高的转变&#xff09;和下降…...

Python爬取读书网的图片链接和书名并保存在数据库中

一个比较基础且常见的爬虫&#xff0c;写下来用于记录和巩固相关知识。 一、前置条件 本项目采用scrapy框架进行爬取&#xff0c;需要提前安装 pip install scrapy# 国内镜像 pip install scrapy -i https://pypi.douban.com/simple 由于需要保存数据到数据库&#xff0c;因…...

js解决加油站

在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 gas 和 cost &…...

【c++|opencv】二、灰度变换和空间滤波---5.中值滤波

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 1. 中值滤波 #include<iostream> #include<opencv2/opencv.hpp> #include"Salt.h"using namespace cv; using namespace std;voi…...

python之pytorch多进程

目录 1、创建并运行并行进程 2、使用队列&#xff08;Queue&#xff09;来共享数据 3、进程池 4、进程锁 5、比较使用多进程和使用单进程执行一段代码的时间消耗 6、共享变量 多进程是计算机科学中的一个术语&#xff0c;它是指同时运行多个进程&#xff0c;这些进程可以…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...