堆优化版迪杰斯特拉算法
先是朴素版的迪杰斯特拉算法
存储结构为邻接矩阵
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;
}
堆优化版迪杰斯特拉算法相关推荐
- 堆优化版迪杰斯特拉(Dijkstra)算法简单分析
堆优化版迪杰斯特拉算法: 优化原理: 上面的朴素版迪杰斯特拉算法主要缺陷是,每当找到一个最短路径,如果需要找下一个最短路径,就需要在完成松弛操作之后,遍历dist数组,寻找其中的最小值.遍历dist数 ...
- dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...
- dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少(示例代码)...
算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...
- 图论的灵魂——带你走进迪杰斯特拉算法的世界
你好,我是小黄,一名独角兽企业的Java开发工程师. 感谢茫茫人海中我们能够相遇, 俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习 希望优秀的你可以和我一起学习,一起努力,实现属于 ...
- 迪杰斯特拉算法及其堆优化
迪杰斯特拉算法及其堆优化 迪杰斯特拉算法是一种求解图的单点最短路径的算法. 一句话来说就是找最近点,更新相邻距离,再找最近点,更新相邻距离 迪杰斯特拉算法的原理是 1.首先在没有中间节点的情况下,也就 ...
- c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法
小禹禹们,你们好,景禹最近已经开学,忙着准备毕业答辩的事情,这才抽身个大家更新文章,还请莫怪.生活实属不易,有时候让人有点儿焦头烂额,甚至想让景禹放弃继续更新文章,可是千百号人默默地关注者景禹,当然也 ...
- 迪杰斯特拉算法(dijkstra)_朴素版_堆优化版
文章目录 Dijkstra算法 ①朴素版(适用于稠密图) 具体实现 ②堆优化版 具体实现 Dijkstra算法 适用于单源最短路且边权都为正数 例:输入有向图/无向图,输出n号点到1号点的最短距离 ① ...
- 迪杰斯特拉算法优化(dijkstra)
dijkstra常规实现方式:迪杰斯特拉算法(dijkstra)https://blog.csdn.net/weixin_48898946/article/details/120990493 这里主要 ...
- 迪杰斯特拉算法实现-Dijkstra 简单版
迪杰斯特拉算法实现单源最短路 使用了 邻接表来存放图的信息,使用了优先级队列. #include <iostream> #include<queue> #include< ...
最新文章
- 矩阵的直接LU分解法
- ps一点等于多少厘米_50寸液晶电视尺寸是多少
- excel 2010 group and subtotal function
- 事情各大厂商在战场上布局
- java 保存inputstream_java如何将一个InputStream写入文件啊?
- react中弹框的显示隐藏
- clion的project区的字体以及自动排版的快捷键修改
- TypeScript 类装饰器的一个例子和使用单步调试搞清楚其运行原理
- Lua开发学习4-普通循环和迭代器循环
- Linux查看设备 eth,lspci grep Eth,查看Linux下的各种硬件设备是否识别或存在之用
- 蔬菜基地售卖系统stage1
- 我的网站被黑了,关键词被劫持,总结一下是怎么解决的。
- 教你React Native使用fetch实现图片上传
- linux---动静态库编译及使用
- BiliBili后台源码45MB全部泄露,中奖概率写在注释里,密码硬编码,看懂了你就欧气满满(提供下载)!
- 物流前沿理论与方法1
- 【PhotoScan精品教程】PhotoScan简介、安装教程(附PhotoScan1.4.5安装包下载)
- 打破第一范式的要求 (中英对照)Michael Rys 对 SQL Server 2005 中XML 的 评论——对微软SQL Server项目经理Michael Rys博士的采访
- app 上架到苹果应用商店
- 个人博客 HTML个人介绍网页 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计
热门文章
- 用火狐浏览器打开百度并进行搜索
- 反选EXCEL数据区域已选定的单元格
- There is no map catalog on the database. Please first create Map Catlog
- 扫描文件顺序乱了怎么办?教你PDF页面重新排序
- PCA 浅显易懂的数学原理
- 餐厅售饭机经常出现的问题
- 清新淡雅个人简历PPT模板
- 简易牛角插座直针/弯针间距 2.54mm DC2-10P/8/14/16/34/40/64P卡钩尺寸图
- 电脑网页打不开,提示错误err connection如何处理呢
- Xshell 和 Xftp安装及使用