【模板】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.搜索:取出队 ...
随机推荐
- Javaweb之Jsp
1. JSP是什么? JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结束. 2. JSP带 ...
- Java使用Schema模式对XML验证
XML允许创作者定义自己的标签,因其灵活的特性让其难以编写和解析.因此必须使用某种模式来约束其结构.目前最流行的这种模式有两种:DTD和SCHEMA,而后者以其独特的优势即将取代DTD模式,目前只是过 ...
- ASP渲染下拉框使时间依次减少
<% x=year(now()) y=year(now())-1 Do While y>2002%><li><a href="#201 ...
- Codevs2018 反病毒软件
2018 反病毒软件 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 查看运行结果 题目描述 Description 其实这个“反病毒软件”(Anti ...
- 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场
1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 498 Solve ...
- jeesite学习(一) common部分(1)
我们按照先细节后整体的方式来进行学习,即先了解各个包中包含的内容,再从整体上看各个包之间的关系. 0 common中的包 先看jeesite的common组件,common中共包含14个包(如下图), ...
- mongodb选型问题
一.Mongodb的介绍 MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便. MongoDB工作在收集和文件的概念. 数据库 数据库是一个物理容器集合.每个数据库都 ...
- (11)连个工具类之间的比较4.Collections与Arrays
集合框架中的工具类:特点:该工具类中的方法都是静态的. Collections:常见方法: 1, 对list进行二分查找: 前提该集合一定要有序. int binarySearch(list,key) ...
- 对于自定义标签类中JspBody类的invoke方法的理解
下面是javaeeAPI中对于invoke()方法的介绍: 其中的参数out是一个Writer类的对象,如果写null,就是将标签体内容写到了与此jsp相关联的JspWriter对象,也就是下面的w: ...
- Logistic Regression理论总结
简述: 1. LR 本质上是对正例负例的对数几率做线性回归,因为对数几率叫做logit,做的操作是线性回归,所以该模型叫做Logistic Regression. 2. LR 的输出可以看做是一种可能 ...