单源最短路问题--朴素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一直是错的.. 这个堆优化其实很容易 ...
随机推荐
- Light of future-冲刺Day 2
目录 归属班级 →2019秋福大软件工程实践Z班 作业要求 →团队作业第五次-项目冲刺 团队名称 未来之光 这个作业的目标 第二天的冲刺总结 作业正文 →Light of future-冲刺Day 2 ...
- H5的新特性
https://blog.csdn.net/weixin_42441117/article/details/80705203 1.h5新语义元素(有利于代码可读性和SEO)2.本地存储 h5提供 ...
- 大曾Blogs使用说明书😊——Super ITZ
大曾Blogs使用说明书 先敲黑板,四句话: pipe搜索,简洁,用于跳转,博客园及csdn和github 博客园炫酷界面,用于查看主要博文 csdn所有博客汇总,查看详细信息 github项目源码汇 ...
- ubuntu18.04配置宽带上网
1.将 /etc/NetworkManager 目录下的 managed标签改为true 2.将 /etc/network/ 目录下的 interfaces文件只留下前两行: auto lo ifac ...
- 用three.js开发三维地图实例
公司要做智慧消防楼层可视化,需要用到web3d,开源的引擎中先研究了cesium三维地球,但cesium做楼层感觉是大材小用,而且体验也不好,最终选用的是功能强大.更适合小型场景的three. thr ...
- python这门语言为什么要起这个名字
我只是一只可爱的小虫 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Liz喵 PS:如有需要Python学习资料的小 ...
- window 10 安装paddlepaddle 1.7 GPU版本
window 10 安装paddlepaddle 1.7 GPU版本 1)更新显卡驱动 2)安装cuda 10 https://developer.nvidia.com/cuda-10.0-downl ...
- Dae-Da-Lus小组idea集锦
Dae-Da-Lus小组成员经过认真的思考,每一位同学都提出了自己对于Team Project的想法,暂时Mark在这里,以备查阅~ 曹士杰: 作为一个计算机专业的学生,我想我们应该是幸运的.计算机科 ...
- E - Travel by Car
连接https://atcoder.jp/contests/abc143/tasks/abc143_e 题目大意: 在一个无向图中,当前的油量为L,给出q个问题,判断从a到b需要多少加几次油,路上每个 ...
- JavaScript的运行机制!!!很重要很重要!!!!!!请看大神操作!
https://juejin.im/post/59e85eebf265da430d571f89