[算法学习]优先队列优化的dijkstra算法求最短路
时间:2020-04-13
本文章向大家介绍[算法学习]优先队列优化的dijkstra算法求最短路,主要包括[算法学习]优先队列优化的dijkstra算法求最短路使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
dijkstra可用于求单个顶点到其他顶点的最短路径
其核心思想是DP,用已经求出的最短路径去更新到其他点的最短路径
时间复杂度优秀但不适用于带负权边的图。
具体做法:用dis存储起始点到各个点的当前距离,初始化为inf,到自己的距离初始化为0
每次取出距起点距离最近的点,用这个点去更新起点到其他点的距离,然后标记避免重复进行操作
朴素做法是O(n^2)的,但我们可以利用每次都取出的是最小距离这个特性利用优先队列对其进行优化
代码:
const int maxn = 1e4 + 5; int n,m,s; struct edge{ int to,w; }; struct node{ int w,now; bool operator<(const node a) const { return w > a.w; } }; int a,b,c; vector<edge> mp[maxn]; //vector存边 int dis[maxn]; priority_queue<node> q; //优先队列对每个顶点进行处理 int f[maxn]; //标记当前顶点是否已经对其他点进行过更新操作 int main(){ cin>>n>>m>>s; while(m--){ scanf("%d%d%d", &a, &b, &c); mp[a].push_back(edge{b,c}); } //读入边 for(int i = 1; i <= n; i++) dis[i] = 0x3f3f3f3f; dis[s] = 0; //初始化dis数组 q.push(node{0,s}); while(!q.empty()){ node x = q.top(); q.pop(); int u = x.now; if(f[u]) continue; f[u] = 1; for(int i = 0; i < mp[u].size(); i++){ if(dis[mp[u][i].to] > dis[u] + mp[u][i].w){ dis[mp[u][i].to] = dis[u] + mp[u][i].w; q.push(node{dis[mp[u][i].to], mp[u][i].to}); } } //dijkstra核心代码 } //优先队列处理 for(int i = 1; i <= n; i++) cout<<dis[i]<<" "; return 0; }
dijkstra的核心就是
if(dis[mp[u][i].to] > dis[u] + mp[u][i].w){
dis[mp[u][i].to] = dis[u] + mp[u][i].w;
如果可以将距离缩短,更新距离并将该点入队(因为已经是距起点最近的点了,更新出的距离也会是最短距离,其他点不可能将它更新到更短的距离)
因此每次更新后入队的点都已经是距源点的最近距离了,因此每个点只需要入队一次。
从而有了O(mlogn)的复杂度
原文地址:https://www.cnblogs.com/leafsblogowo/p/12691922.html
- centos7下卸载python后yum不能使用的恢复方法
- hdu---(5038)Grade(胡搞)
- shell生成随机字符的几种方法
- Python时间获取及转换
- spark streaming知识总结[优化]
- 让你真正明白spark streaming
- Centos7 firewalld防火墙基本操作
- Spark Sql系统入门4:spark应用程序中使用spark sql
- Flume+Kafka收集Docker容器内分布式日志应用实践
- CentOS7搭建ELK日志集中分析平台
- Centos安装sshfs实现挂载目录
- shell脚本监控磁盘使用率
- Python使用MD5加密字符串
- Spark MLlib之 KMeans聚类算法详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则T.40: 使用函数对象向算法传递操作
- web页面性能优化总结及原理解释
- C++核心准则T.41:在模板概念中只对本质属性定义需求
- Linux实用技巧——mail发送邮件命令以及中文乱码解决
- Julia机器学习实战——使用Random Forest随机森林进行字符图像识别
- Python函数——Numpy size()
- Day 1:二维数组中查找
- Day 2:替换空格
- Prometheus监控神器-Kubernetes篇(三)
- julia简易教程——安装Julia+jupyter notebooks
- Julia 终于正式发布了
- awk 列求和计算
- C++复习笔记——0_零碎问题及解决笔记
- C++复习笔记——C++ 关键字
- python函数——字典设置默认值 setdefault()