SPFA和堆优化的Dijk
朴素dijkstra时间复杂度$O(n^{2})$,通过使用堆来优化松弛过程可以使时间复杂度降到O((m+n)logn);dijkstra不能用于有负权边的情况,此时应使用SPFA,两者写法相似。
朴素dijk:
int dist[maxn];//距离
int g[maxn][maxn];//邻接矩阵存图
bool vis[maxn];//是否访问过
void dijk(int v){//起点v
memset(dist, 0x3f,sizeof dist);
dist[v]=;
for(int i=;i<n;i++)
{
int t=-;
for(int j=;j<=n;j++)
if(!vis[j]&&(t==-||dist[t]>dist[j]))
t=j;
vis[t]=true;
for(int j=;j<=n;j++)
dist[j]=min(dist[j],dist[t]+g[t][j]);
}
}
堆优化的dijk:(练习题 洛谷P4479)
vector<pair<int,int> > g[maxn];//距离,点标
int dist[maxn];
bool vis[maxn];
void dijk(int v){
memset(dist,0x3f,sizeof(dist));
dist[v]=;
priority_queue<pair<int,int> >pq;//距离,点标
pq.push({-dist[v],v});//默认大的优先,故取负数使小的优先,也可自定义结构体
while(!pq.empty()){
int t=pq.top().second;
pq.pop();
if(vis[t]) continue;
vis[t]=true;
for(int i=; i<g[t].size(); i++){
if(dist[g[t][i].second]>dist[t]+g[t][i].first){
dist[g[t][i].second]=dist[t]+g[t][i].first;
pq.push({-dist[g[t][i].second],g[t][i].second});
}
}
}
}
SPFA:(练习题:蓝桥杯ALGO-5)
1.开一个队列,起点入队,距离初始化为无穷
2.若队列不空
1)每次取出队首进行松弛操作
2)若需要更新则更新,同时判断连接点是否在队列中,若不在则入队
3)(可选)记录入队次数,判断是否有负环
vector<pair<int,int> > g[maxn];//点标,距离
int dist[maxn];
bool inq[maxn];
void spfa(int s){
memset(dist,0x3f,sizeof(dist));
queue<int> q;
q.push(s);
inq[s]=;
dist[s]=;
while(!q.empty()){
int t=q.front();
q.pop();
inq[t]=false;
for(int i=; i<g[t].size(); ++i){
int to=g[t][i].first;
if(dist[to]>dist[t]+g[t][i].second){
dist[to]=dist[t]+g[t][i].second;
if(inq[to]) continue;
inq[to]=true;
q.push(to);
}
}
}
}
SPFA和堆优化的Dijk的更多相关文章
- 复习最短路 spfa+dijstra堆优化
题目很简单,, 但是wa了三次,, 用<vector>之前一定要记得clear()...简单说下 spfa的问题 和bell_forman有点类似 每次取出一个点 然后更新 并把更新了的节 ...
- 最短路模板[spfa][dijkstra+堆优化][floyd]
借bzoj1624练了一下模板(虽然正解只是floyd) spfa: #include <cstdio> #include <cstring> #include <alg ...
- dij+堆优化
写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个: 香甜的奶油: #include<iostream> #include<cstdio> #include<cs ...
- [CF1146D]Frog Jumping_exgcd_堆优化dij
Frog Jumping 题目链接:http://codeforces.com/contest/1146/problem/D 数据范围:略. 题解: 首先发现,如果$x\ge a +b$,那么所有的$ ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- 最短路模板|堆优化Dijkstra,SPFA,floyd
Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f ...
- POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)
昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...
- [BZOJ1576] [Usaco2009 Jan]安全路经Travel(堆优化dijk + (并查集 || 树剖))
传送门 蒟蒻我原本还想着跑两边spfa,发现不行,就gg了. 首先这道题卡spfa,所以需要用堆优化的dijkstra求出最短路径 因为题目中说了,保证最短路径有且只有一条,所以可以通过dfs求出最短 ...
- 堆优化的Dijkstra
SPFA在求最短路时不是万能的.在稠密图时用堆优化的dijkstra更加高效: typedef pair<int,int> pii; priority_queue<pii, vect ...
随机推荐
- scp 远程文件拷贝命令
Linux scp命令用于Linux之间复制文件和目录. scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 1.从本地复制到远程 命令格式: ...
- CSS阴影 box-shadow属性用法
box-shadow: 它可以设置一个或者多个下拉阴影的框 语法:box-shadow:h-shadow v-shadow blur spread color inset 注意:该属性把一个或者多个下 ...
- Vue学习笔记:计算属性
使用函数的缺点 如果我们想要将数据经过转化后再显示,或者多个数据结合起来进行显示,一般可以直接在数据渲染或者数据绑定的时候书写表达式 如果表达式过于复杂,或者逻辑太多的时候,我们可以将其封装在函数里, ...
- [转]利用 Commons-Fileupload 实现文件上传
转载 Java Web开发人员可以使用Apache文件上传组件来接收浏览器上传的文件,该组件由多个类共同组成,但是,对于使用该组件来编写文件上传功能的Java Web开发人员来说,只需要了解和使用其中 ...
- 14 JavaScript Window对象
Window对象表示一个浏览器窗口或者一个框架. 在客户端JavaScript中,window对象是全局对象,所有的表达式都在当前的环境中计算. Window对象的子对象: JavaScript do ...
- 报错PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"
今天在调用第三方HTTPS接口的时候,一直显示这个报错,然后百度很久,有2种解决方法,一个是说自己手动去导入,第二种用代码忽略证书验证.我用二种方式, 复制即用, public void test2( ...
- virtual column make sqlserver using function index
In sqlserver, it is impossible that if we want to create an function index. Doesn`t means we can not ...
- 一个DBA的雄心壮志
math-liu, 一个甲方的DBA,同时他还有另外一个名字“怕提神”.在某甲方工作的他最近这几年如打了鸡血一般工作起来完全由拼命三郎的那股劲,据说能唯一使他感到一丝鼓励和安慰的是以下这两位大牛前辈. ...
- 通过Java创建XML(中文乱码已解决)
package com.zyb.xml; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.Ou ...
- Codeforces1303D. Fill The Bag
1e18对应2进制有58位,可以直接暴力模拟,因为读入的数都是2次幂,__builtin_ctz这个内置gcc函数可以算出二进制下末尾有几个0,读入时统计,然后从n的最低位开始判断,注意每次升位的时候 ...