c++ 堆优化版dijkstra 代码实现
dijkstra是图论中解决最短路问题的重要算法之一,必须熟练掌握
dijkstra用于解决单源最短路问题,要求图中必须不存在负边权
朴素dijkstra的时间复杂度为O(n^2),堆优化版dijkstra的时间复杂度为O(mlogn),两者的主要差异在于堆优化版采用优先队列来存储当前所在的点和与这个点联通的点之间的距离,从而免去了一次寻找与当前点联通且距离最小的点的循环
下面是代码,不易理解的地方会有注释,帮助理解
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f//无穷大
using namespace std;
const int N=1e6;
int e[N*2],ne[N*2],h[N],cnt=0,w[N],dis[N],st[N]={0},s,m,n;
//w用于存储边的权值;dis存储每个点到源点的距离;st为状态数组,1表示当前点已找到最短路,0则相反
//s为初始点,m为边的数量,n为点的数量
typedef pair<int,int> pii;//first为到源点距离,second为节点编号
priority_queue<pii,vector<pii>,greater<pii> >heap;//定义优先队列,注意greater后一定加一个空格
//stl的优先队列默认为大根堆,加上greater后为小根堆
void add(int a,int b,int c)//采取邻接表存储图
{e[cnt]=b;ne[cnt]=h[a];w[cnt]=c;h[a]=cnt++;return ;
}
void dijkstra()//dijkstra算法主体
{ memset(dis,0x3f,sizeof dis);//易漏,将dis清成无穷大 dis[s]=0;heap.push({0,s});while(!heap.empty()){pii t=heap.top();//优先队列与普通队列不同,访问队头用top heap.pop();int y=t.second;if(st[y]==0){st[y]=1;int v=t.first;for(int i=h[y];i!=-1;i=ne[i]){int j=e[i];dis[j]=min(dis[j],v+w[i]);//松弛操作 heap.push({dis[j],j});}}}return ;
}
int main()
{memset(h,-1,sizeof h);//易漏,必须将链表“数组”清成-1 cin>>m>>n;for(int i=1;i<=m;i++){int a,b,c;//a->b 且 此边权值为c cin>>a>>b>>c;add(a,b,c);}cin>>s;dijkstra();//最后,若一点到源点距离为inf,则此点与源点不连通,若不等于inf,则dis[该点编号]即为其到源点距离 return 0;
}
此为帮助自己理解记忆而创作,若有不足之处还请多多指教
c++ 堆优化版dijkstra 代码实现相关推荐
- 堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II
堆优化版dijkstra算法分析: 朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程. 可以用小根堆(C++STL priority_queue)对dist数 ...
- AcWing 850. Dijkstra求最短路 II【最短路】【堆优化版Dijkstra】
AcWing 850. Dijkstra求最短路 II 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 850. Dijkstra求 ...
- ~~堆优化版dijkstra
时间复杂度 O(mlogn), n 表示点数,m 表示边数 typedef pair<int, int> PII;int n; // 点的数量 int h[N], w[N], e[N], ...
- PAT甲级1003 Emergency Dijkstra算法(堆优化版/朴素版)
前言 最近花了很多的时间在写JAVA项目上面,疏忽了算法和数据结构的学习.最近突然醒悟基础更为重要,打算从今天开始每天抽出一些时间做下PAT甲级的题目.现有题库的前两题很简单,从第三题开始吧. 题 ...
- 最短路[Dijkstra和堆优化的Dijkstra][Bellman-Ford和SPFA][Floyd最短路](更新中)
文章目录 第一类:单源最短路 一 所有边权都是正数(Dijkstra) 朴素版Dijkstra(稠密图) 堆优化版Dijkstra(稀疏图) 二 存在负权边(BF和SPFA) 第二类:多源汇最短路(F ...
- 堆优化版迪杰斯特拉(Dijkstra)算法简单分析
堆优化版迪杰斯特拉算法: 优化原理: 上面的朴素版迪杰斯特拉算法主要缺陷是,每当找到一个最短路径,如果需要找下一个最短路径,就需要在完成松弛操作之后,遍历dist数组,寻找其中的最小值.遍历dist数 ...
- 迪杰斯特拉算法(dijkstra)_朴素版_堆优化版
文章目录 Dijkstra算法 ①朴素版(适用于稠密图) 具体实现 ②堆优化版 具体实现 Dijkstra算法 适用于单源最短路且边权都为正数 例:输入有向图/无向图,输出n号点到1号点的最短距离 ① ...
- 插入排序算法 及其二分搜索优化版 C++代码实现 恋上数据结构笔记
复习梗概 文章目录 复习梗概 插入排序算法思想 插入排序时间复杂度与特性(多少,与什么有关?) 插入排序基础版 插入排序2nd优化版(优化了哪里?) !!!插入排序二分搜索优化版(优化了哪里?如何优化 ...
- Dijkstra算法(堆优化版求稀疏图最短路)
南昌理工acm集训队 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题. 基本思想 Dijkstra算法是用来解决不 ...
最新文章
- 微软软件测试的可借鉴之处
- jdbc驱动_JDBC概述和CRUD
- T4文本模板转换过程
- 关于程序员30/35岁以后就写不了代码(没前途)的问题。
- ARM指令中STM和LDM的理解误区
- 电容过大导致电压下降_现场| 典型的断直流电源导致开关误分合案例分析
- hook 与aspectj_将AspectJ与NetBeans平台开发集成
- 提高Java的锁性能
- word手写字体以假乱真_Word小技巧|打印作文草稿纸
- linux 下常用操作命令
- 隐藏TreeView中SiteMap的根节点
- 怎么将webm格式转换为mp4
- word2vec模型
- Android键盘 AOSP监听delete按键
- 利用消费者的猎奇心理,制造病毒式传播
- 1688、京东、拼多多各大电商平台API接口调用示例
- css响应式网页设计:自适应屏幕宽度、移动页面开发技巧
- JavaC++题解与拓展——leetcode398.随机数索引【水塘抽样学习】
- excel生成动态进度条
- HTML form表单添加enctype属性后获取不到input值