【模板】Dijkstra的heap优化
为了将最小费用最大流的spfa优化,决定将spfa换成heap优化的Dijkstra。(dijkstra不能处理负边权)
所以还得现学。。。
白点表示已经确定最短路径的点。
蓝点表示还未确定最短路径的点。
因为普通的dijkstra是每次从蓝点中找到一个距离起点的距离最小的点,然后把这个点变成白点,随后枚举这个点相连的所有蓝点,若以此白点为中转点到达相连蓝点的路径更短的话就更新蓝点到起点的最短距离。
这个时间复杂度是O(n^2)的。
显然,枚举在枚举到起点最小距离的蓝点时,可以运用heap优化。
所以时间复杂度就降为O((n+m)logn)。(n为顶点数,m为边数)
大部分情况下还是跑不过spfa的,慎用。
stl大法好。
——附带码
#include <cstdio>
#include <queue>
#include <cstring>
#define Heap pair<int, int>
//第一个int存的是到起点的距离,第二个int存的是点的编号 using namespace std; const int INF = ;
int n, m, t, cnt;
int next[], to[], val[], head[], dis[];
bool vis[];
priority_queue <Heap, vector <Heap>, greater <Heap> > q;
//按照第一个int从小到大排序 inline void add(int a, int b, int c)
{
to[cnt] = b;
val[cnt] = c;
next[cnt] = head[a];
head[a] = cnt++;
} inline void Dijkstra(int s)//以s为起点
{
int i, u, v;
Heap x;
for(i = ; i <= n; i++) dis[i] = INF;
dis[s] = ;
q.push(make_pair(, s));//入队
while(!q.empty())
{
x = q.top();
q.pop();
u = x.second;
if(vis[u]) continue;//判断是否已经是最短路径上的点
vis[u] = ;
for(i = head[u]; i != -; i = next[i])//更新距离
{
v = to[i];
if(dis[v] > dis[u] + val[i])
{
dis[v] = dis[u] + val[i];
q.push(make_pair(dis[v], v));
}
}
}
} int main()
{
int i, j, a, b, c, s;
scanf("%d %d %d", &n, &m, &s);
memset(head, -, sizeof(head));
for(i = ; i <= m; i++)
{
scanf("%d %d %d", &a, &b, &c);
add(a, b, c);
}
Dijkstra(s);
for(i = ; i <= n; i++) printf("%d ", dis[i]);
return ;
}
【模板】Dijkstra的heap优化的更多相关文章
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- VMware12全新安装CentOS-6.9模板机(已优化)
1.从安装系统开始准备 安装中添加网卡 eth0 ip 10.0.0.210 netmask 24 gateway 10.0.0.254 DNS servers 223.5.5.5 eth1 ip 1 ...
- [dijkstra+heap优化] 模板
var n,m,s,i,j,x,y,z,l,tot :longint; pre,last,other,len :..] of longint; heap,d,pl :Array[..] of long ...
- Radix Heap ---Dijkstra算法的优化 BY Gremount
Radix Heap 算法是在Dijkstra的Dial实现的基础上,通过减少对桶的使用,来优化算法的时间复杂度: Dial 时间复杂度是O(m+nC) -------C是最长的链路 Radi ...
- 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)
<题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...
- 模板 Dijkstra+链式前向星+堆优化(非原创)
我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...
- 【模板】prim的heap优化
简单的代码.. 时间复杂度为O((n + m)logn) 大部分情况下还是跑不过kruskal的,慎用. #include <cstdio> #include <queue> ...
- Dijkstra+set堆优化局部模板
这是某天2018-10-25写的某题(P1613-luogu)的局部代码,目的是方便自己记忆一些细节,所以这里不过多赘述算法原理或题目 邻接矩阵mapp表示有向图 struct ELE { int i ...
- [模板] dijkstra (堆优化)
复杂度O(mlogn) 输入起点s,可以得到从起点到各点的最短路距离数组dis[i] 过程: 1.初始化:清空标记数组,初始化距离数组设为inf,起点距离设为0,开优先队列,搜索起点 2.搜索:取出队 ...
随机推荐
- 如何用好消息推送(JPush)为app拉新、留存、促活
如何用好消息推送(JPush)为app拉新.留存.促活 作为移动端APP产品运营最重要的运营手段,消息推送(JPush)被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越 ...
- Swift 包管理器命令行使用
1.swift -version //swift 版本查看 2.swift build //swift工程编译 3.swift package generate-xcodeproj //创建Xcode ...
- Vue开源项目库汇总
最近做了一个Vue开源项目库汇总,里面集合了OpenDigg 上的优质的Vue开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. UI组件 elem ...
- Linux下,Nginx的安装、升级及动态添加模块
系统基于ubuntu server 14.04.4 amd64 安装 第一步 下载并解压Nginx压缩包 从Nginx官网下载Nginx,或者在Linux上执行wget http://nginx.or ...
- Codeblocks快捷键
Codeblocks快捷键: Ctrl+Shift+Enter:复制控制台exe内容 Ctrl+Z:撤销 Ctrl+F:查找 Ctrl+R:查找替换功能 Ctrl+Shift+C:加注释 C ...
- AlloyFinger.js 源码 学习笔记及原理说明
此手势库利用了手机端touchstart, touchmove, touchend, touchcancel原生事件模拟出了 rotate touchStart multipointStart ...
- 加入大型的js文件如jQuery文件,Eclipse会报错
在使用Eclipse3.7及以后的版本的时候,加入大型的js文件如jQuery文件,会报错(missing semicolon),文件中会显示红色小X,虽然这个错误并不会影响项目的运行,但是这个却会大 ...
- MySQL查询语句的45道练习
一.设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四) ...
- Markdown轻量级标记语言
1. Markdown是什么? Markdown是一种轻量级标记语言,它以纯文本形式(易读.易写.易更改)编写文档,并最终以HTML格式发布.Markdown也可以理解为将以MARKDOWN语言编写的 ...
- HBase架构
文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6573817.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...