先是朴素版的迪杰斯特拉算法

存储结构为邻接矩阵

int  dijstra(int n)
{for (int i = 1; i <= n; i++){dist[1] = 0;int index = -1;for (int j = 1; j <= n; j++)//找到已更新结点(dist值被更新)中距离最近的节点{if (!vis[j] && (dist[j] < dist[index] || index == -1)){index = j;}}vis[index] = 1;//确定到该点的最短路,标记为1for (int j = 1; j <= n; j++)//用刚确定的节点更新dist值{dist[j] = min(dist[j], dist[index] + mp[index][j]);}}if (dist[n] == 0x3f3f3f3f)return 0;else return dist[n];
}

迪杰斯特拉算法实际上是一种贪心的算法,不难发现迪杰斯特拉时间复杂度为O(n2),节点数达到1e5时绝对会超时,所以我们要想办法优化这个算法。

这个算法中有一部分是寻找距离最近的节点,我们可以通过建立小根堆来优化这一过程,这样堆顶节点一定是需寻找的最近节点。这里我们不需要手写堆来实现,使用stl中的priority_queue(优先队列)即可实现。相应的我们将存储图的结构改为邻接表(此处使用的是链式前向星模拟邻接表)

int dijstra(int n)
{priority_queue<PII, vector<PII>, greater<PII>>heap;//建立优先队列memset(dist, 0x3f, sizeof(dist));dist[1] = 0;heap.push({ 0,1 });while (heap.size()){PII t = heap.top();heap.pop();int ver = t.second, dis = t.first;if (vis[ver])continue;vis[ver] = 1;for (int i = head[ver]; i != -1; i = ne[i]){int j = e[i];if (dist[j] > dist[ver] + w[i]){//如果采用朴素版写法此处无论是不是更新长度,j都会入堆dist[j] = dist[ver] + w[i];heap.push({ dist[j],j });}}}if (dist[n] == 0x3f3f3f3f)return -1;return dist[n];
}

用一个题目来测试一下

A - 图结构练习——最短路径https://acm.sdut.edu.cn/onlinejudge3/contests/3988/problems/A完善代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int n, m, cnt;
int dist[N],vis[N];
int head[N], e[N], ne[N], w[N];
typedef pair<int, int> PII;
int dijstra(int n)
{priority_queue<PII, vector<PII>, greater<PII>>heap;memset(dist, 0x3f, sizeof(dist));dist[1] = 0;heap.push({ 0,1 });while (heap.size()){PII t = heap.top();heap.pop();int ver = t.second, dis = t.first;if (vis[ver])continue;vis[ver] = 1;for (int i = head[ver]; i != -1; i = ne[i]){int j = e[i];if (dist[j] > dist[ver] + w[i]){dist[j] = dist[ver] + w[i];heap.push({ dist[j],j });}}}if (dist[n] == 0x3f3f3f3f)return -1;return dist[n];
}
void add(int a, int b, int c)//建立邻接表
{e[cnt] = b;w[cnt] = c;ne[cnt] = head[a];head[a] = cnt++;
}
int main()
{while (cin >> n >> m){cnt = 0;memset(head, -1, sizeof(head));memset(vis, 0, sizeof(vis));while (m--){int a, b, c;cin >> a >> b >> c;add(a, b, c);//无向图所以要两次addadd(b, a, c);}cout << dijstra(n) << endl;}return 0;
}

堆优化版迪杰斯特拉算法相关推荐

  1. 堆优化版迪杰斯特拉(Dijkstra)算法简单分析

    堆优化版迪杰斯特拉算法: 优化原理: 上面的朴素版迪杰斯特拉算法主要缺陷是,每当找到一个最短路径,如果需要找下一个最短路径,就需要在完成松弛操作之后,遍历dist数组,寻找其中的最小值.遍历dist数 ...

  2. dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...

  3. dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少(示例代码)...

    算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...

  4. 图论的灵魂——带你走进迪杰斯特拉算法的世界

    你好,我是小黄,一名独角兽企业的Java开发工程师. 感谢茫茫人海中我们能够相遇, 俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习 希望优秀的你可以和我一起学习,一起努力,实现属于 ...

  5. 迪杰斯特拉算法及其堆优化

    迪杰斯特拉算法及其堆优化 迪杰斯特拉算法是一种求解图的单点最短路径的算法. 一句话来说就是找最近点,更新相邻距离,再找最近点,更新相邻距离 迪杰斯特拉算法的原理是 1.首先在没有中间节点的情况下,也就 ...

  6. c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法

    小禹禹们,你们好,景禹最近已经开学,忙着准备毕业答辩的事情,这才抽身个大家更新文章,还请莫怪.生活实属不易,有时候让人有点儿焦头烂额,甚至想让景禹放弃继续更新文章,可是千百号人默默地关注者景禹,当然也 ...

  7. 迪杰斯特拉算法(dijkstra)_朴素版_堆优化版

    文章目录 Dijkstra算法 ①朴素版(适用于稠密图) 具体实现 ②堆优化版 具体实现 Dijkstra算法 适用于单源最短路且边权都为正数 例:输入有向图/无向图,输出n号点到1号点的最短距离 ① ...

  8. 迪杰斯特拉算法优化(dijkstra)

    dijkstra常规实现方式:迪杰斯特拉算法(dijkstra)https://blog.csdn.net/weixin_48898946/article/details/120990493 这里主要 ...

  9. 迪杰斯特拉算法实现-Dijkstra 简单版

    迪杰斯特拉算法实现单源最短路 使用了 邻接表来存放图的信息,使用了优先级队列. #include <iostream> #include<queue> #include< ...

最新文章

  1. 矩阵的直接LU分解法
  2. ps一点等于多少厘米_50寸液晶电视尺寸是多少
  3. excel 2010 group and subtotal function
  4. 事情各大厂商在战场上布局
  5. java 保存inputstream_java如何将一个InputStream写入文件啊?
  6. react中弹框的显示隐藏
  7. clion的project区的字体以及自动排版的快捷键修改
  8. TypeScript 类装饰器的一个例子和使用单步调试搞清楚其运行原理
  9. Lua开发学习4-普通循环和迭代器循环
  10. Linux查看设备 eth,lspci grep Eth,查看Linux下的各种硬件设备是否识别或存在之用
  11. 蔬菜基地售卖系统stage1
  12. 我的网站被黑了,关键词被劫持,总结一下是怎么解决的。
  13. 教你React Native使用fetch实现图片上传
  14. linux---动静态库编译及使用
  15. BiliBili后台源码45MB全部泄露,中奖概率写在注释里,密码硬编码,看懂了你就欧气满满(提供下载)!
  16. 物流前沿理论与方法1
  17. 【PhotoScan精品教程】PhotoScan简介、安装教程(附PhotoScan1.4.5安装包下载)
  18. 打破第一范式的要求 (中英对照)Michael Rys 对 SQL Server 2005 中XML 的 评论——对微软SQL Server项目经理Michael Rys博士的采访
  19. app 上架到苹果应用商店
  20. 个人博客 HTML个人介绍网页 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计

热门文章

  1. 用火狐浏览器打开百度并进行搜索
  2. 反选EXCEL数据区域已选定的单元格
  3. There is no map catalog on the database. Please first create Map Catlog
  4. 扫描文件顺序乱了怎么办?教你PDF页面重新排序
  5. PCA 浅显易懂的数学原理
  6. 餐厅售饭机经常出现的问题
  7. 清新淡雅个人简历PPT模板
  8. 简易牛角插座直针/弯针间距 2.54mm DC2-10P/8/14/16/34/40/64P卡钩尺寸图
  9. 电脑网页打不开,提示错误err connection如何处理呢
  10. Xshell 和 Xftp安装及使用