dijkstra算法及模板题

⭐️dijkstra

介绍(想看的可以看)

Dijkstra算法( /ˈdaɪkstrəz/ DYKE-str z)是一种用于找到加权图中的节点之间的最短路径的算法,该加权图可以表示例如道路网络。它是由计算机科学家Edsger W. Dijkstra于1956年出版,三年后出版。
该算法存在许多变体。Dijkstra的原始算法找到了两个给定节点之间的最短路径,但更常见的变体将单个节点固定为“源”节点,并找到从源到图中所有其他节点的最短路径,生成最短路径树。
对于图中给定的源节点,该算法找到该节点与其他节点之间的最短路径。 它也可以用于找到从单个节点到单个目的地节点的最短路径,一旦到目的地节点的最短路径已经确定,就停止算法。例如,如果图中的节点表示城市,而边路径的成本表示通过直接道路连接的成对城市之间的驾驶距离(为简单起见,忽略红灯,停车标志,收费公路和其他障碍物),则Dijkstra算法可以用于找到一个城市和所有其他城市之间的最短路线。最短路径算法的一个广泛应用是网络路由协议,最著名的是IS-IS(中间系统到中间系统)和OSPF(开放最短路径优先)。它也被用作其他算法(如约翰逊算法)的子程序。
Dijkstra算法使用的标签是正整数或真实的数字,它们是完全有序的。它可以推广到使用任何部分有序的标签,只要后续标签(遍历边时产生后续标签)是单调非递减的。这种推广称为通用Dijkstra最短路径算法。
Dijkstra的算法使用一种数据结构来存储和查询从一开始就按距离排序的部分解。Dijkstra的原始算法不使用最小优先级队列,并在时间 。该算法的思想也在Leyzorek et al. 1957中给出。Fredman & Tarjan 1984提出使用Fibonacci堆最小优先级队列来优化运行时间复杂度到 。这是渐近已知的最快的单源最短路径算法任意有向图与无界非负权重。然而,特殊情况(如有界/整数权重,有向无环图等)确实可以进一步改进,如专业化变体中所述。此外,如果允许预处理,诸如收缩层次结构之类的算法可以快七个数量级。
在许多领域,特别是人工智能领域,Dijkstra算法或其变体被称为均匀成本搜索,并被公式化为更一般的最佳优先搜索思想的实例.

另外的两个最短路算法
bellman-ford算法
floyd算法


具体原理

在图中所有的边上,排满多米诺骨牌,相当于把骨牌看成图的边。一条边上的多米诺骨牌数量,和边的权值(例如长度或费用)成正比。规定所有骨牌倒下的速度都是一样的。如果在一个结点上推倒骨牌,会导致这个结点上的所有骨牌都往后面倒下去。
  在起点s推倒骨牌,可以观察到,从s开始,它连接的边上的骨牌都逐渐倒下,并到达所有能达到的结点。在某个结点t,可能先后从不同的线路倒骨牌过来;先倒过来的骨牌,其经过的路径,肯定就是从s到达t的最短路;后倒过来的骨牌,对确定结点t的最短路没有贡献,不用管它。
  从整体看,这就是一个从起点s扩散到整个图的过程。
  在这个过程中,观察所有结点的最短路径是这样得到的:
  (1)在s的所有直连邻居中,最近的邻居u,骨牌首先到达。u是第一个确定最短路径的结点。从u直连到s的路径肯定是最短的,因为如果u绕道别的结点到s,必然更远。
  (2)然后,把后面骨牌的倒下分成2部分,一部分是从s继续倒下到s的其它的直连邻居,另一部分从u出发倒下到u的直连邻居。那么下一个到达的结点v,必然是s或者u的一个直连邻居。v是第二个确定最短路径的结点。
  (3)继续以上步骤,在每一次迭代过程中,都能确定一个结点的最短路径。
  Dijkstra算法应用了贪心法的思想,即“抄近路走,肯定能找到最短路径”。算法可以简单概况为:Dijkstra = BFS + 贪心。实际上,“Dijkstra + 优先队列 = BFS + 优先队列(队列中的数据是从起点到当前点的距离)”。
  下面分析复杂度。设图的点有n个,边有m条。编码的时候,集合A一般用优先队列来模拟。优先队列可以用堆或其他高效的数据结构实现,往优先队列中插入一个数、取出最小值的操作都是O(logn)的。一共往队列中插入m次(每条边都要进集合A一次),取出n次(每次从集合A中取出距离s最短的一个点,取出时要更新这个点的所有邻居到s的距离,设一个点平均有k个邻居),那么总复杂度是O(m×logn + n×k×logn) O(m×logn),一般有m大于n。


模板题

问题描述

蓝桥王国一共有N个建筑和M条单向道路,每条道路都连接着两个建筑,每个建筑都有自己编号,分别为1∼。(其中皇宫的编号为1)国王想让小明回答从皇宫到每个建筑的最短路径是多少,但紧张的小明此时已经无法思考,请你编写程序帮助小明回答国王的考核。


格式输入

输入第一行包含2个正整数N,M。第2到M+1行每行包含三个正整数u,v,w,表示u→v之间存在一条距离为w的路。1≤N≤3×105,1≤m≤106,1≤ui ,vi≤N,0≤wi≤109。


格式输出

输出仅一行,共N个数,分别表示从皇宫到编号为1∼N建筑的最短距离,两两之间用空格隔开。(如果无法到达则输出−1)


样例输入

3 3
1 2 1
1 3 5
2 3 2


样例输出

0 1 3


解析

dijkstra求解


参考程序

#include<bits/stdc++.h>
//#define inf LONG_MAX
using namespace std;
const long long inf=0x3f3f3f3f3f3f3f3fLL;
const int N=3e5+2;
int n,m,u,v;
long long dis[N],w;
struct edg{int to;long long d;
};
vector<edg> g[N];
struct node{int id;long long dis;bool operator < (const node & a)const{return dis>a.dis;}node(int b,long long c){id=b;dis=c;}
}; 
void dijkstra()
{//node node1(1,0);dis[1]=0;priority_queue <node> q;q.push(node(1,0));int done[N];for (int i=1;i<=n;i++)done[i]=0;while(!q.empty()){node node1=q.top();q.pop();int id1=node1.id;if(done[id1]) continue;done[id1]=1;int sz=g[id1].size();for (int i=0;i<sz;i++){if(done[g[id1][i].to]) continue;if(dis[g[id1][i].to]>node1.dis+g[id1][i].d)dis[g[id1][i].to]=node1.dis+g[id1][i].d;q.push(node(g[id1][i].to,dis[g[id1][i].to]));}}}
int main()
{cin>>n>>m;for (int i=1;i<=n;i++)dis[i]=inf;for (int i=1;i<=m;i++){cin>>u>>v>>w;g[u].push_back({v,w});//g[v].push_back({u,w});}dijkstra();for (int i=1;i<=n;i++){if(dis[i]>=inf)cout<<-1<<" ";elsecout<<dis[i]<<" ";} return 0;}

以个人刷题整理为目的,如若侵权,请联系删除~

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

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

相关文章

吴恩达ReinforcementLearning Docker镜像构筑

Reinforcement Learning课程Docker镜像制作 前提从Dockerfile构建可用image最后 前提 参照吴恩达机器学习环境本地化构建wsldockertensorflowcuda的1~3构建了Docker可运行的环境 从Dockerfile构建可用image 下载附件并命名为的Dockerfile 在Dockerfile所在的文件夹下运行 do…

docker的dockerfile

FROM Dockerfile中的第一个指令&#xff0c;也是一个必须的指令。它用于指定构建新镜像时所基于的基础镜像。 FROM <image>:<tag> FROM nginx:1.25.1-alpineRUN 指令在Dockerfile中可以出现多次&#xff0c;并且每个RUN指令都会创建一个新的镜像层。为了减少镜像…

富格林:梳理正规本领远离虚假套路

富格林悉知&#xff0c;黄金投资者在从事黄金交易之前&#xff0c;必须先了解黄金交易的风险。因为投资虽然能给你带来一定的收益&#xff0c;但往往也有亏损的风险。在进场后投资者可通过正规经验指导有效避免因为虚假诱导带来的异常亏损&#xff0c;增加安全做单盈利机会。以…

DC电源模块与其他电源模块有着明显的区别与优势

DC电源模块与其他电源模块有着明显的区别与优势 BOSHIDA DC电源模块&#xff08;Direct Current Power Supply Module&#xff09;是一种将交流电转换为直流电的设备&#xff0c;常用于电子设备和工业控制系统中。与其他电源模块相比&#xff0c;DC电源模块有一些明显的区别和…

R语言ggplot2 | 热图+随机森林重要性!升级版~

&#x1f4cb;文章目录 原图复现定义ggrf_ggcor_plot()函数加载数据集一键出图函数优点 今天推出一个升级版&#xff1a; ggrf_ggcor_plot的函数。只需要输入 响应变量的矩阵和 解释变量的矩阵&#xff0c;就能轻松一键生成随机森林重要性相关性热图。 原图 所需复现的随机森…

推荐5款测试数据生成工具!

一个成功、有效的测试策略由下面几个基本部分组成&#xff1a;完整的测试覆盖率、最小化的环境影响和健壮的测试数据。 其中测试数据尤其重要&#xff0c;其质量直接关系到测试的有效性。可以把测试数据看作是保持测试引擎运行的燃料——高质量的测试数据有助于确保测试执行的…

极速体验DolphinScheduler 3.2.1 Standalone 版[一]

文章目录 极速体验DolphinScheduler 3.2.1 Standalone 版前置准备工作启动 DolphinScheduler Standalone Server解压并启动 DolphinScheduler登录 DolphinScheduler 启停服务配置数据库 极速体验DolphinScheduler 3.2.1 Standalone 版 Standalone 仅适用于 DolphinScheduler 的…

【go从入门到精通】函数详解

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

【蓝桥杯】tarjan算法

一.概述 Tarjan 算法是基于DFS的算法&#xff0c;用于求解图的连通性问题。 Tarjan 算法可以在线性时间内求出&#xff1a; 无向图&#xff1a; 割点与桥双连通分量 有向图&#xff1a; 强连通分量必经点与必经边 1.割点&#xff1a; 若从图中删除节点 x 以及所有与 x 关联的…

Intel AIPC发布会:开启AI终端应用的新纪元

2024年3月27日下午&#xff0c;Intel在北京市朝阳区凤凰中心举办了AIPC发布会开启了AI终端应用的新征程。 整场发布会围绕着‘让不可想象&#xff0c;变为寻常’主线进行。在本次发布会上&#xff0c;众多PC端的AI应用得到了展示&#xff0c;包括&#xff1a;智谱AI&#xff…

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-寻找2020

数据很恶心&#xff0c;但是考点挺友好~ 把测试数据黏贴到记事本中&#xff0c;知测试数据的行列数 然后根据规则判断2020是否出现&#xff0c;并累计其次数即可。 判断可能需要注意超出下标&#xff0c;可以索性把数组定大些。 #include<stdio.h> const int N 310; ch…

哈曼卡顿音箱解决关闭自动休眠 + 自用车载音乐分享制作

一&#xff1a;哈曼卡顿音箱解决关闭自动休眠 1. 背景&#xff1a;每天做最多的事情就是开音箱电源。问了客服&#xff0c;说只有玻璃4才能关闭休眠。搞得我都想买新音箱了。 2. 解决办法&#xff1a;电脑开机启动一个阻止功放休眠.exe&#xff0c;可以设置自动启动&#x…

Redis入门到实战-第十九弹

Redis实战热身Count-min-sketch篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、…

Android Studio 无法下载 gradle-7.3.3-bin.zip

下载新的Android Studio&#xff0c;然后创建新的工程时&#xff0c;出现报错&#xff1a;Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.3.3-bin.zip 或者超时&#xff0c;我们可以复制&#xff1a;https://services.grad…

IntellIJ Idea 内存不足时怎么设置

文章目录 前言背景一、 内存显示二、 在IDEA中设置内存三 、在IDEA中打开内存的设置文件四、 JetBrains ToolBox 中安装 IntellIJ Idea配置文件位置总结 前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博客&#xff1a;南国以南i、 提示&#xff1a;以下是本篇文章…

【React】react 使用 lazy 懒加载模式的组件写法,外面需要套一层 Loading 的提示加载组件

react 组件按需加载问题解决 1 错误信息2 解决方案 1 错误信息 react 项目在创建 router 路由时&#xff0c;使用 lazy 懒加载时&#xff0c;导致以下报错&#xff1a; The above error occurred in the <Route.Provider> component:Uncaught Error: A component suspe…

qiankun实现基座、子应用样式隔离

目录 qiankun 实现主应用与子应用样式隔离使用CSS-in-JS来实现样式隔离react-jssstyled-components qiankun 实现主应用与子应用样式隔离 qiankun 之中默认的样式隔离是针对子应用与子应用之间的。至于主应用的样式会影响到子应用&#xff0c;若需要&#xff0c;则需要配置进行…

计算机基础系列 —— CPU

“Make everything as simple as possible, but no simpler.” – Albert Einstein 文中提到的所有实现都可以参考&#xff1a;nand2tetris_sol&#xff0c;但是最好还是自己学习课程实现一遍&#xff0c;理解更深刻。 之前的文章里我们介绍了 Register、PC、RAM 和 ALU&#…

【Linux实践室】Linux用户管理实战指南:用户密码管理操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;用户密码存放地及方式2.2 &#x1f514;使用…

PAT乙级 1046 划拳 C语言实现

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就赢了&#xff0c;输家罚一杯酒。两人同赢或两人同输则继续下一轮&…