单源最短路问题--朴素Dijkstra & 堆优化Dijkstra
许久没有写博客,更新一下~
Dijkstra两种典型写法
1. 朴素Dijkstra 时间复杂度O(N^2) 适用:稠密图(点较少,分布密集)
#include <cstdio>
#include <iostream>
#include <cstring> using namespace std;
const int N=;
int n, m;
int g[N][N], dist[N];
bool st[N]; int dijkstra()
{
memset(dist, 0x3f, sizeof(dist));
dist[]=;
for(int i=; i<n; i++)
{
int t=-;
for(int j=; j<=n; j++)
if(!st[j] && (t==- || dist[t]>dist[j])) t=j; //1. S中求最近的点,目前到起点的最小值
st[t]=true; //2. 更新状态 t点到起点的最短路已经被确定
for(int j=; j<=n; j++)
dist[j]=min(dist[j], dist[t]+g[t][j]); //3. 用t更新,经过t可能构成的最短路
}
if(dist[n]==0x3f3f3f3f) return -;
else return dist[n];
} int main()
{
scanf("%d%d", &n, &m);
memset(g, 0x3f, sizeof(g));
for(int i=; i<m; i++)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
g[x][y]=min(g[x][y], z);
}
printf("%d\n", dijkstra());
return ;
}
2. 堆优化Dijkstra 时间复杂度:O(m*log(n)) 适合:稀疏图(边较多,点分布不集中)
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring> using namespace std;
const int N=1e5+;
typedef pair<int, int> PII;
int h[N], e[N], ne[N], w[N], idx;
bool st[N];
int n, m, dist[N]; void add(int a, int b, int c)
{
e[idx]=b, ne[idx]=h[a], w[idx]=c, h[a]=idx++; //建图
} int dijkstra()
{
memset(dist, 0x3f, sizeof(dist));
dist[]=;
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({, });
while(heap.size())
{
auto u=heap.top(); //取已确定到起点最小距离的点, O(1)
heap.pop();
int ver=u.second, dis=u.first;
if(st[ver]) continue;
st[ver]=true;
for(int i=h[ver]; i!=-; i=ne[i])
{
int j=e[i];
if(!st[j] && dist[j]>dis+w[i]) //这里的dis可以写成dist[ver]
{ //用pair存储距离、节点编号,为了以 距离 建堆
dist[j]=dist[ver]+w[i]; //注意这里的w[i] , 边的权值存储在节点对应位置
heap.push({dist[j], j}); //入堆,O(log(n))
} //每一条边都会被遍历到,总时间复杂度O(m*log(n))
}
}
if(dist[n]==0x3f3f3f3f) return -;
else return dist[n];
} int main()
{
scanf("%d%d", &n, &m);
memset(h, -, sizeof(h));
while(m--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
}
printf("%d\n", dijkstra()); return ;
}
单源最短路问题--朴素Dijkstra & 堆优化Dijkstra的更多相关文章
- luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- 【Luogu P3371&P4779】【模板】单源最短路径(线段树优化Dijkstra)
线段树优化$\rm dijkstra$ 线段树每个节点维护$[l,r]$中$dist$最小的点,删除则把该点$dist$赋值为$+\infty$,然后更新该点影响到的线段树上的其他节点即可. 可以得到 ...
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 洛谷 P3371 【模板】单源最短路径(堆优化dijkstra)
题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...
- 深入理解dijkstra+堆优化
深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra 对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...
- 堆优化 dijkstra 简介
dijkstra 前言 原本我真的不会什么 dijkstra 只用那已死的 spfa ,还有各种玄学优化,可是,我不能相信一个已死的算法,就像我不能相信自己. ps : 虽然他已经活了 序 我站在镜子 ...
- POJ 2502 - Subway Dijkstra堆优化试水
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...
- 配对堆优化Dijkstra算法小记
关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏 ...
- 堆优化dijkstra
单源最短路径 题目链接:https://www.luogu.org/problemnew/show/P4779 直到做了这个题才发现我之前写的堆优化dijkstra一直是错的.. 这个堆优化其实很容易 ...
随机推荐
- NKOJ3777 卡牌操作
问题描述 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].现在,有m个熊孩子来破坏你的卡片了!第i个熊孩子会交换c[i]和d[i]两个位置上的卡片. ...
- 《Three.js 入门指南》3.1.1 - 基本几何形状 - 平面(PlaneGeometry)
3.1 基本几何形状 平面(PlaneGeometry) 说明: 这里的平面(PlaneGeometry)其实是一个长方形,而不是数学意义上无限大小的平面. 构造函数: THREE.PlaneGeom ...
- 安装myeclipse-10.7.1及注册解码
1.安装myeclipse-10.7.1 (1)百度云下载地址: http://pan.baidu.com/s/1dDwbI1b (2)按照默认安装路径安装myeclipse-10.7.1 默认安 ...
- 【php】php操作MySQL数据库
一.操作步骤: 1. 连接MySQL数据库并判断是否连接成功2. 选择数据库3. 设置字符集4. 准备SQL语句5. 向MySQL服务发送SQL语句6. 解析处理结果集7. 释放结果集,关闭数据库连接 ...
- go 接口与动态类型
Go 没有类:数据(结构体或更一般的类型)和方法是一种松耦合的正交关系. 二.动态方法调用 通常需要编译器静态检查的支持:当变量被赋值给一个接口类型的变量时,编译器会检查其是否实现了该接口的所有函数.
- Jquery 搜索等待用户输入完成时自动执行
$('#fuzzySearchBox').on('keyup', function (event) { var searchStr = $(this).val().toLowerCase(); //i ...
- Scala——的并行集合
当出现Kafka单个分区数据量很大,但每个分区的数据量很平均的情况时,我们往往采用下面两种方案增加并行度: l 增加Kafka分区数量 l 对拉取过来的数据执行repartition 但是针对这种 ...
- 视频图文教学 - 用最快的速度把 DotNet Core Blazor 程序安装到 树莓派中 并且用网页控制 GPIO 闪灯
前言 dotnet core 在3.0时代已经发展得很好. 尤其是在跨平台方面更已经是达到了很实用的阶段. 作为 dotnet 程序员, 应该对 Linux 有充分的了解, 也可以在业余时间玩玩硬件, ...
- Docker-准备Docker环境
1. 前言 要学习Docker,首先要搭建出虚拟机和docker环境.我的笔记本电脑是windows7系统,用VirtualBox创建虚拟机.虚拟机操作系统为CentOS7.5,Docker版本为18 ...
- SpringBoot实现图片上传demo&Nginx进行代理显示
公司项目需要一个图片上传的功能,就图片能上传到服务器(公司用的windows服务器),然后nginx能进行代理访问到就行了,先简单介绍一下nginx,然后再来实现功能. 一.nginx简介 Nginx ...