单源最短路问题--朴素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一直是错的.. 这个堆优化其实很容易 ...
随机推荐
- Oracle ROWNUM用法
很多朋友应该跟我一样有个疑问,为什么rownum > 5 的时候会查不到一条数据,用rownum < 5就可以查到数据,明明查询所有的时候rownum有很多啊,小朋友,你是不是有很多问号? ...
- Fiddler插件---将Mapi请求自动转为HTTPRunner测试用例(YAML格式)
背景 继之前鼓捣出了Mapi解密插件之后,在团队内已经使用了三年之久,一跃成为团队最爱欢迎的测试工具之一(加个之一,低调谦虚一点). 随着团队推行HttpRunner搞接口自动化:编写和维护Case带 ...
- thinkphp后端开发ajax接口开发测试(2)
非常好用的Postman,Google chrome上必备测试ajax接口插件:
- NullPointerException的处理新方式,Java14真的太香了
在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25.最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPoint ...
- Array(数组)对象-->数组的删除
1.数组的删除: 用delete操作符删除特定的元素 删除元素的位置只是被留空了,为undefined值 举例:删除下面数组中的第二个元素 var arr = [1,2,3,4,5]; /*删除第二个 ...
- NumPy学习1:基本概念
NumPy的数组类被称作 ndarray .通常被称作数组.注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能.更多重要ndarray对象 ...
- Python Requests-学习笔记(6)-响应头
响应头 我们可以查看以一个Python字典形式展示的服务器响应头: import requestsurl = 'http://httpbin.org/post'r = requests.get(url ...
- centos7安装puppet详细教程(简单易懂,小白也可以看懂的教程)
简介: Puppet是一种linux.unix平台的集中配置管理系统,使用ruby语言,可配置文件.用户.cron任务.软件包.系统服务等.Puppet把这些系统实体称之为资源,它的设计目标是简化对这 ...
- sparkRdd driver和excuter
//1 从内存中创建makeRdd,底层实现就是parallelize val rdd=sc.makeRDD(Array(1,2,"df",55)) //2 从中创建paralle ...
- (一) Mybatis源码分析-解析器模块
Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...