堆优化Dijkstra算法
但是,我们会发现刚刚讲的朴素Dijkstra算法(高情商:朴素 ; 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间;
所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新其他的点的时候是O(n)的,又因为是稀疏图我们不能用邻接矩阵来存储,所以我们就会想到用邻接表来存储,那么我们在找能更新的位置时,我们就会根据邻接表的单链表进行存储,把更新后的点放入堆中,这样的时间复杂度是O(mlogn)的;
然后最复杂的地方是,我们再用朴素的 Dijkstra算法查找到起始点的最近距离的时候我们用了O(n^2)的时间复杂度,我们要把这里给优化是效果最好的,所以我们引入了堆(近似完全二叉树 || 优先队列:聪明的人都知道用STL,谁还笨笨的手写堆啊!!!),我们从起始点开始push进堆中,然后每个更新的点我们也都放入堆中,因为这个堆能自动的维护大小顺序,我们一开始先定义为一个小根堆,然后每次取堆顶并出堆,就完成了找到里起始点最近的点的目的;
同样的,对于每个节点我们都要用一个st数组来标记,因为我们既然访问到他了,那么他一定是当前离起始点最近的点,我们就可以大胆的将其设为true(st值)!
代码:
#include<bits/stdc++.h>
#define x first
#define y second
#define maxn 150010
using namespace std;
typedef pair<int, int> PII;
int h[maxn],e[maxn],w[maxn],ne[maxn],idx,n,m,dist[maxn];
bool st[maxn];
void add(int a, int b, int c)
{
e[idx] = b; w[idx] = c; ne[idx] = h[a] ; h[a] = idx++;
}
int dijkstra(){
memset(dist , 0x3f,sizeof(dist));
priority_queue<PII , vector<PII> , greater<PII> > heap;
PII start;
start.x = 0 ; start.y = 1;
heap.push(start);
while(heap.size()){
PII t = heap.top();
heap.pop();
int ver = t.y , distance = t.x;
if(st[ver]) continue;
st[ver] = true;
for(int i = h[ver] ; i!=-1 ; i = ne[i]){
int j = e[i];
if(dist[j] > distance + w[i]){
dist[j] = distance + w[i];
PII mid;
mid.x = dist[j] ;mid.y = j;
heap.push(mid);
}
}
}
if(dist[n] == 0x3f3f3f3f) return -1;
else return dist[n];
}
int main()
{
memset(h,-1,sizeof(h));
cin >> n >> m;
for(int i = 1;i<=m;i++){
int a,b,c;
cin >> a >> b >> c;
add(a, b, c);
}
int ans = dijkstra();
cout << ans;
return 0;
}
堆优化Dijkstra算法的更多相关文章
- 配对堆优化Dijkstra算法小记
关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏 ...
- 使用最小堆优化Dijkstra算法
OJ5.2很简单,使用priority_queue实现了最小堆竟然都过了OJ……每次遇到relax的问题时都简单粗暴地重新push进一个节点…… 然而正确的实现应该是下面这样的吧,关键在于swap堆中 ...
- luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- 堆优化 dijkstra 简介
dijkstra 前言 原本我真的不会什么 dijkstra 只用那已死的 spfa ,还有各种玄学优化,可是,我不能相信一个已死的算法,就像我不能相信自己. ps : 虽然他已经活了 序 我站在镜子 ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- 【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost
[题目大意] 给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案. [思路] 在堆优化Dijkstra中,用pre记录前驱.如果新方案 ...
随机推荐
- MySQL 日志管理及备份与恢复
MySQL 日志管理及备份与恢复 1.日志管理 2.备份与恢复 1.日志管理: MySQL的默认日志保存位置为/usr/local/mysql/data 日志开启方式有两种:通过配置文件或者是通过命令 ...
- 【HDU6647】Bracket Sequences on Tree(树Hash 树上Dp)
题目链接 大意 给出一颗树,按下列方式生成一个括号序列. function dfs(int cur, int parent): print('(') for all nxt that cur is a ...
- 带你十天轻松搞定 Go 微服务之大结局(分布式事务)
序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...
- 踩坑系列-Java Calendar
Calendar是Java util包下的日期Api,其中获取月份是当前月份-1 public class Demo { public static void main(String[] args) ...
- Python基础—基础数据类型list(Day4)
基础数据类型 四.list列表 存放大量数据,大量的数据在列表中便于操作,列表示有序的,有索引值,可切片,方便取值. 1.list的增 1).append('元素') 在列表后面按元素添加 ...
- Spring Data JPA应用 之查询分析
在Spring Data JPA应用之常规CRUD操作初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)尾附上了JpaRepository接口继承关系及方法,可以知道JpaRepos ...
- Spring AOP基础概念及自定义注解式AOP初体验
对AOP的理解开始是抽象的,看到切点的匹配方式其实与正则表达式性质大致一样就基本了解AOP是基本是个什么作用了.只是整个概念更抽象,需要具化理解.下图列表是AOP相关概念解释,可能也比较抽象^_^ 比 ...
- Excel入门简单,想要进阶实属不易?推荐这个数据分析工具
大数据时代,数据分析在我们的日常生活和工作中应用越来越广泛,不管是公司的行政.人事.销售.运营还是专业的数据分析师,都经常需要通过数据来发现业务问题,因此数据分析正逐渐成为职场通用能力. 说到数据分析 ...
- 【C# 线程】开篇 线程
概述 线程主要学习什么,通过一个月的摸索.终于总结出来了:学习Thread类涉及到学习Thread类涉及到线程单元状态: ApartmentState.GetApartmentState\SetApa ...
- Hadoop - MapReduce学习笔记(详细)
第1章 MapReduce概述 定义:是一个分布式运算程序的编程框架 优缺点:易于编程.良好的扩展性.高容错性.适合PB级以上数据的离线处理 核心思想:MapReduce 编程模型只能包含一个Map ...