dijkstra算法的大题思路是通过n - 1次迭代,每次迭代把一个点距汇点的最短路确定,当n - 1次循环过后所有点的最短路都已经确定

注意:dijkstra算法只适用于没有负权边的单源最短路

以下是算法的详细步骤

#include <iostream>
#include <cstring>
#include <algorithm> using namespace std; const int N = 510; int n,m;
int dist[N];
int g[N][N];
bool st[N]; int dijkstra()
{
memset(dist,0x3f,sizeof dist);
dist[1]=0; for(int i=1;i<n;i++)
{
int t = -1;
for(int j=1;j<=n;j++)
//在没有确定最短路的点里面找
if(!st[j]&&(t == -1||dist[t]>dist[j]))//"=="才是逻辑判断错多少遍才能记住
t=j; for(int j=1;j<=n;j++)
dist[j] = min(dist[j],dist[t]+g[t][j]); st[t] = true; } if(dist[n] == 0x3f3f3f3f) return -1;
else return dist[n];
}
int main()
{
scanf("%d %d",&n,&m); memset(g,0x3f,sizeof g); while(m--)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c); g[a][b]=min(g[a][b],c);
}
int t=dijkstra(); printf("%d\n",t); return 0;
}

堆优化版 

我们可以通过堆这一数据结构快速地找到未确定最短路的点里找到距离汇点最近的点从而优化dijkstra

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue> using namespace std; const int N = 1e6 + 10; int h[N], e[N], ne[N], w[N], idx; int dist[N],st[N]; int n, m; typedef pair<int, int> PII; void add(int a, int b,int c)
{
e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx ++;
} int dijstra()
{
memset(dist, 0x3f3f, sizeof dist);
dist[1] = 0; priority_queue<PII, vector<PII>, greater<PII>> heap; heap.push({0,1}); while(heap.size())
{
auto t = heap.top(); heap.pop(); int ver = t.second, d = t.first; if(st[ver]) continue;
st[ver] = true; for(int i = h[ver]; i != -1; i = ne[i])
{
int j = e[i];
if(d + w[i] < dist[j])
{
dist[j] = d + w[i];
heap.push({dist[j], j});
}
} } if(dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
} int main()
{
cin>>n>>m;
memset(h, -1, sizeof h); while(m --)
{
int a, b, c; cin>>a>>b>>c;
add(a,b,c);
} cout<<dijstra()<<endl; return 0;
}

​​​​​​​

dijkstra算法(朴素 + 堆优化)的更多相关文章

  1. dijkstra算法的堆优化

    普通的dijkstra算法模板: //数据结构 int g[LEN][LEN]; //邻接矩阵 int vis[LEN]; //标记是否访问 int dist[LEN] //源点到各点的距离 fill ...

  2. 单源最短路径:Dijkstra算法(堆优化)

    前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...

  3. 单源最短路问题 Dijkstra 算法(朴素+堆)

    选择某一个点开始,每次去找这个点的最短边,然后再从这个开始不断迭代,更新距离. 代码: 朴素(vector存图) #include <iostream> #include <cstd ...

  4. 【Luogu P4779】dijkstra算法的堆优化

    Luogu P4779 利用堆/优先队列快速取得权值最小的点. 在稠密图中的表现比SPFA要优秀. #include<iostream> #include<cstdio> #i ...

  5. Dijkstra算法(朴素实现、优先队列优化)

    Dijkstra算法只能求取边的权重为非负的图的最短路径,而Bellman-Ford算法可以求取边的权重为负的图的最短路径(但Bellman-Ford算法在图中存在负环的情况下,最短路径是不存在的(负 ...

  6. dijkstra最短路算法(堆优化)

    这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...

  7. 关于dijkstra的小根堆优化

    YY引言 在NOI2018D1T1中出现了一些很震惊的情况,D1T1可以用最短路解决,但是大部分人都在用熟知的SPFA求解最短路.而SPFA的最坏复杂度能够被卡到$O(VE)$.就是边的数量乘以点的数 ...

  8. Dijkstra算法与堆(C++)

    Dijkstra算法用于解决单源最短路径问题,通过逐个收录顶点来确保得到以收录顶点的路径长度为最短.      图片来自陈越姥姥的数据结构课程:https://mooc.study.163.com/l ...

  9. dijkstra算法之优先队列优化

    github地址:https://github.com/muzhailong/dijkstra-PriorityQueue 1.题目 分析与解题思路 dijkstra算法是典型的用来解决单源最短路径的 ...

  10. prim最小生成树算法(堆优化)

    prim算法原理和dijkstra算法差不多,依然不能处理负边 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct edge ...

随机推荐

  1. 5.2 基于ROP漏洞挖掘与利用

    通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这 ...

  2. Web网页音视频通话之Webrtc相关操作(二)

    效果图 HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  3. GitHub搜索指令教程

    in:根据某个关键词来进行检索 关键词: name:项目名称 description:项目描述 readme:项目帮助文档 语法: 需要检索的内容:in:name或description或readme ...

  4. 实践分析丨AscendCL应用编译&运行案例

    本文分享自华为云社区<AscendCL应用编译&运行问题案例>,作者: 昇腾CANN. AscendCL(Ascend Computing Language)是一套用于在昇腾平台上 ...

  5. 树形DP + 换根DP

    树形DP--基础 P1352 没有上司的舞会 设 \(f[i][0/1]\) 表示第 \(i\) 个人不去或者去. 如果第 \(i\) 个人没去,那么下属可去可不去,所以 \(f[i][0] = \s ...

  6. Uncaught TypeError: Failed to set the 'currentTime' property on 'HTMLMediaElement': The provided double value is non-finite.

    musicSeekTo: function(value){this.audio.currentTime = this.audio.duration*value; }, musicVoiceSeekTo ...

  7. python-stack

    implements list deque LifoQueue 原文地址:https://realpython.com/how-to-implement-python-stack/ Argue lis ...

  8. C++多线程中互斥量的使用

    多线程中互斥信号量(Mutex)的使用 1.0 互斥量的基本概念 1.1 Example \(\quad\)首先我们要明白,为什么会有互斥信号量的出现,在多线程编程中,不同的线程之间往往要对同一个数据 ...

  9. 关于API数据接口获取商品的数据的说明

    ​ 获取商品数据已经成为许多应用程序的重要组成部分.为了实现这一目标,许多公司和技术开发者使用API数据接口来获取相关数据.本文将详细介绍如何使用API数据接口获取商品数据,并使用Python作为编程 ...

  10. 多层前馈神经网络及BP算法

    一.多层前馈神经网络 首先说下多层前馈神经网络,BP算法,BP神经网络之间的关系.多层前馈[multilayer feed-forward]神经网络由一个输入层.一个或多个隐藏层和一个输出层组成,后向 ...